为什么printf(“%d”,1 / 0.0)的输出为0?

时间:2013-12-03 03:31:33

标签: c floating-point printf undefined-behavior divide-by-zero

我使用 codeblock

当代码是:

printf("%d",1/0);

程序无法运行,出现错误。但是当我写这篇文章时:

printf("%d",1/0.0);

程序可以运行,输出为0。我想知道原因。

3 个答案:

答案 0 :(得分:5)

1/01/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