该声明
printf("%f\n",0.0f);
打印 0。
然而,该声明
printf("%f\n",0);
打印随机值。
我意识到我表现出了某种未定义的行为,但我无法具体弄清楚为什么。
所有位均为 0 的浮点值仍然有效float
值为 0。
float
and int
在我的机器上尺寸相同(如果相关的话)。
为什么在中使用整数文字而不是浮点文字printf
导致这种行为?
附:如果我使用,可以看到相同的行为
int i = 0;
printf("%f\n", i);
The "%f"
格式需要类型参数double
。你给它一个类型参数int
。这就是行为未定义的原因。
该标准不保证全零是有效的表示0.0
(尽管经常如此),或任何double
值,或者那个int
and double
大小相同(记住它是double
, not float
),或者,即使它们大小相同,它们也会以相同的方式作为参数传递给可变参数函数。
它可能碰巧在您的系统上“工作”。这是未定义行为的最糟糕的症状,因为它使得诊断错误变得困难。
N15707.21.6.1 第 9 段:
...如果任何参数不是相应的正确类型
转换规范,行为未定义。
类型参数float
被提升为double
, 这就是为什么printf("%f\n",0.0f)
作品。整数类型的参数小于int
被提升为int
or to unsigned int
。这些升级规则(由 N1570 6.5.2.2 第 6 段指定)在以下情况下没有帮助:printf("%f\n", 0)
.
请注意,如果您传递一个常量0
到一个非可变参数函数,该函数期望double
参数,行为是明确定义的,假设函数的原型是可见的。例如,sqrt(0)
(after #include <math.h>
) 隐式转换参数0
from int
to double
-- 因为编译器可以从声明中看到sqrt
它期望一个double
争论。没有这样的信息printf
。可变参数函数如printf
是特殊的,在给他们写电话时需要更加小心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)