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

时间:2017-08-09 14:11:08

标签: c

运行此代码时,我遇到浮点异常。

为什么文字zero divison error没有打印?应该打印它,因为{/ 1}}在除以零之前执行

printf("zero divison error")

2 个答案:

答案 0 :(得分: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

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

  

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

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

答案 1 :(得分:2)

每个人都疯狂地投票,甚至没有花时间阅读你的问题,所以我重新发布并希望人们花时间阅读更好的问题和答案。

您的问题是为什么句子zero divison error没有显示,因为您在除以零之前printf()

答案是:

发送到stdout的数据被缓冲,你没有在字符串的末尾提供任何换行符,所以该行在应用程序崩溃之前保持缓冲。

在除以零之前使用fflush(stdout);刷新stdout,或添加\n,它会正确显示。

代码已审核:

#include<stdio.h>

int main()
{
    int p=0;int a=2;
    // This will show: the \n will flush the string on stdout
    printf("zero divison error\n");
    // This might not show, the operation can fail before the call to printf()
    printf("%d",a/p);
}