繁体   English   中英

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

[英]Why the output of printf(“%d”,1/0.0) is 0?

我使用代码块

当代码是:

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

程序无法运行,出现错误。 但是当我写这个:

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

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

1/01/0.0都是未定义的行为:

C11§6.5.5乘法运算符

/运算符的结果是第一个操作数除以第二个的商。 %运算符的结果是余数。 在这两个操作中,如果第二个操作数的值为零,则行为是不确定的。

您正在通过除以零来调用两种不同形式的未定义行为 ,标准草案第6.5.5节“ 乘法运算符”5段说( 强调我的意思 ):

/运算符的结果是第一个操作数除以第二个的商。 %运算符的结果是余数。 在这两个操作中, 如果第二个操作数的值为零,则行为是undefined

第二种方法是在printf中使用错误的格式说明符,您应该使用%f因为1/0.0的结果是double而不是int C99标准草案第7.19.6.1fprintf函数(在第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM