[英]Why the output of printf(“%d”,1/0.0) is 0?
我使用代码块 。
当代码是:
printf("%d",1/0);
程序无法运行,出现错误。 但是当我写这个:
printf("%d",1/0.0);
程序可以运行,输出为0
。 我想知道为什么。
1/0
或1/0.0
都是未定义的行为:
C11§6.5.5乘法运算符
/
运算符的结果是第一个操作数除以第二个的商。%
运算符的结果是余数。 在这两个操作中,如果第二个操作数的值为零,则行为是不确定的。
您正在通过除以零来调用两种不同形式的未定义行为 ,标准草案第6.5.5
节“ 乘法运算符”第5段说( 强调我的意思 ):
/运算符的结果是第一个操作数除以第二个的商。 %运算符的结果是余数。 在这两个操作中, 如果第二个操作数的值为零,则行为是undefined 。
第二种方法是在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__
的定义可能无法正常工作,正如我在此注释中所指出的那样。
理论上,由于C标准未定义1/0.0
的结果,因此在C实现中可能未定义。 但是,在您使用的C实现中,结果可能是无穷大。 这是因为大多数常见的C实现将(大部分)IEEE 754用于浮点运算。
在这种情况下,您看到的输出原因是1/0.0
具有double
类型,但是您正在使用%d
进行打印,这需要int
类型。 您应该使用接受double
类型的说明符(例如%g
打印。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.