这个声明
printf("%f\n",0.0f);
打印出0。
然而,这个语句
printf("%f\n",0);
打印随机值。
我意识到我正在表现出某种未定义的行为,但我无法确定具体原因。
所有位都是0的浮点值仍然是一个有效的值为0的float
。float
和int
在我的机器上是相同大小的(如果这甚至相关的话)。
为什么在printf
中使用整数字面值而不是浮点数字面值会导致这种行为?
P.S. 如果我使用相同的行为,则可以看到
int i = 0;
printf("%f\n", i);
printf
函数期望输入一个double
数据类型,但你提供了一个int
类型。在你的计算机上,float
和int
可能大小相同,但是当将0.0f
推入变参列表时,它实际上被转换为double
(而printf
函数期望的就是这个)。简而言之,你没有根据你所使用的格式说明符和提供的参数履行printf
函数的协议要求。 - WhozCraig(uint64_t)0
传递而非0
,看看是否仍然会出现随机行为(假设double
和uint64_t
具有相同的大小和对齐方式)。在某些平台上(例如x86_64),由于不同类型被传递到不同的寄存器中,输出很可能仍然是随机的。 - Ian Abbott