我使用 codeblock 。
当代码是:
printf("%d",1/0);
程序无法运行,出现错误。但是当我写这篇文章时:
printf("%d",1/0.0);
程序可以运行,输出为0
。我想知道原因。
答案 0 :(得分:5)
1/0
或1/0.0
都是未定义的行为:
C11§6.5.5乘法运算符
/
运算符的结果是第一个操作数除以的商 第二;%
运算符的结果是余数。 在两个操作中,如果第二个操作数的值为零,则行为未定义。
答案 1 :(得分:2)
您正在调用两个不同形式的undefined behavior,除以零,草案标准部分6.5.5
乘法运算符段 5 表示( 强调我的):
/运算符的结果是来自第一个操作数的除法的商 第二; %运算符的结果是余数。在两个操作中,如果第二个操作数的值为零,则行为未定义。
第二个是在printf中使用了错误的格式说明符,你应该使用%f
,因为1/0.0
的结果是 double 而不是 int 。 C99标准草案部分7.19.6.1
fprintf函数也涵盖 9 段落中的pritnf
:
如果转换规范无效,则行为未定义.248)如果任何参数不是相应转换规范的正确类型,则行为为 未定义。
虽然如果实现支持 IEEE 754 浮点除以零,则应该导致 +/- inf 。并且0/0.0
会生成NaN
。需要注意的是,依据__STDC_IEC_559__
定义可能无效,因为我在此comment中注意到了。
答案 2 :(得分:0)
理论上,1/0.0
的结果可能在C实现中未定义,因为C标准未定义它。但是,在您使用的C实现中,结果可能是无限的。这是因为大多数常见的C实现(主要)使用IEEE 754进行浮点运算。
在这种情况下,您看到的输出原因是1/0.0
具有double
类型,但您使用%d
进行打印,这需要int
类型。您应该使用接受double
类型的说明符打印它,例如%g
。