分为零; 是运行时错误还是编译时错误?

Mav*_*284 -4 c

在运行此代码时,我得到一个浮点异常.

为什么zero divison error没有打印文字?它应该被打印,因为在除零之前printf("zero divison error")执行了零.

#include<stdio.h>

int main()
{
    int p=0;int a=2;
    printf("zero divison error");
    printf("%d",a/p);
    // why zero divison error is not printed? 
    // i am getting floating point exception(core dumped).
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 5

默认情况下,标准输出是行缓冲的.printf("zero division error");将字符写入缓冲区,但缓冲区尚未刷新.在\n那里添加一个新行或用它来刷新输出fflush(stdout);.如果在应用程序崩溃之前未刷新输出,则缓冲区的内容将丢失.


至于错误,C11 6.5.5p5:

/运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数.在这两个操作中,如果第二个操作数的值为零,则行为未定义.

标准中给出了可能发生的一些例子(C11 3.4.3):

2注意可能的未定义行为包括完全忽略不可预测结果的情况,以及以环境特征(有或没有发出诊断消息)的文档化方式执行转换或程序执行,终止翻译或执行(带有发出诊断信息).

因此,使用诊断消息终止执行(您所做的)只是一种可能性.C编译器也可以拒绝编译程序,或者运行时程序可以将结果设置为0或42; 或者完全忽略计算.

当我运行程序时,我明白了

% ./a.out 
zsh: floating point exception (core dumped)  ./a.out
Run Code Online (Sandbox Code Playgroud)

这对应于终止的程序SIGFPE; 虽然它代表SIGnal,浮点异常,但标准表示SIGFPE可以提出

错误的算术运算,例如零分频或导致溢出的运算

在调用信号处理程序时,不再知道实际操作是什么,因此不会打印其他诊断信息.