运行此代码时,我遇到浮点异常。
为什么文字zero divison error
没有打印?应该打印它,因为{/ 1}}在除以零之前执行。
printf("zero divison error")
答案 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);
}