下面的代码没有显示预期的输出,这是垃圾值(奇怪的是这些值被交换了)
#include<stdio.h>
int main()
{
float f = 4.6;
int d = 7;
printf("%d %f\n",f,d);
return 0;
}
输出:
7 4.600000
让我们减少一点:
float f = 4.6;
printf("%d\n", f);
That's 未定义的行为。必须为正确的格式说明符提供正确类型的参数。
未定义的行为可能会导致任何结果,包括您所看到的奇怪结果。
进一步的想法:
现在,您可能会问为什么编译器会生成这段代码。那么让我们看一下 x86-64 程序集的 2 段代码:
int main() {
float f = 4.6;
int d = 7;
printf("%d %f\n", d, f);
return 0;
}
int main() {
float f = 4.6;
int d = 7;
printf("%f %d\n", f, d);
return 0;
}
除了格式字符串之外,这两个代码生成相同的程序集。这可能是因为调用约定要求浮点数与整数放置在不同的寄存器中,或者浮点数应该在堆栈上传递(或以不同方式处理浮点数和整数的任何其他规则)。
这应该可以更清楚地说明为什么您发布的代码仍然产生有用的东西,即使代码刚刚被破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)