【发布时间】:2016-06-15 09:03:33
【问题描述】:
考虑这两个程序:
#include <stdio.h>
int main()
{
int z = 6.4;
printf("%d %d", z, 6.4);
return 0;
}
输出是6 -1717986918。
#include <stdio.h>
int main()
{
int z = 6.4;
printf("%d %d", 6.4, z);
return 0;
}
输出是-1717986918 1075419545。
为什么输出会这样变化?当z 是第一个时,输出打印出正确的z 值,它是6,因为z 是一个整数,但是当我反转参数时,输出是一个不同的值。为什么会这样?
【问题讨论】:
-
我认为这是 C,但如果我将它编译为 C++,我会得到相同的结果:语言标签可能会让更多人关注
-
我只收到编译器警告,说 printf 需要一个整数,而我给它一个双精度。但它编译并打印两个六。你用的是什么编译器?
-
@JanezKuhar 代码块
-
使用 gcc 版本 4.8.4 我得到 4 个六分。但是对于 gcc 5.3.1 版,我得到:第一个
main()为 6 -1717986918,第二个为 6 6。 -
@JanezKuhar:这并不神秘,它是未定义的行为。具有未定义行为的程序在多次调用时可能在不同系统上产生不同的输出,甚至在同一系统上产生不同的输出。试图解释观察到的特定实例的行为几乎没有用。从法医证据调查某些情况时,可以提出有用的解释和改进方向。想想飞机失事、计算机病毒分析、电子邮件黑客......
标签: c floating-point printf type-punning