C 这个程序的输出是什么?

C 这个程序的输出是什么?,c,C,我遇到过这段代码,但当我执行它时,每次它都给出不同的答案。我尝试了不同的编译器gcc和联机,但它们都给出了不同的答案。下面是代码 #include<stdio.h> void main() { float s; s=4/3.3*5-2.2; printf("%d",s); } 编译器警告会告诉您,代码的问题在于浮点不是整数。%d格式打印一个整数 在x86或x86_64体系结构上,由于浮点值s被放入双浮点值的寄存器或堆栈位置,因此会出现一个随机值。这些寄存器与整数寄存器不同。因此

我遇到过这段代码,但当我执行它时,每次它都给出不同的答案。我尝试了不同的编译器gcc和联机,但它们都给出了不同的答案。下面是代码

#include<stdio.h>

 void main()
{
float s;
s=4/3.3*5-2.2;
printf("%d",s);
}

编译器警告会告诉您,代码的问题在于浮点不是整数。%d格式打印一个整数

在x86或x86_64体系结构上,由于浮点值s被放入双浮点值的寄存器或堆栈位置,因此会出现一个随机值。这些寄存器与整数寄存器不同。因此,当printf获取%d的整数值时,它会获取任何剩余的值


但在不同的CPU类型上可能会得到不同的结果。这是您未定义的行为。

编译它并找出未定义的行为是什么。。。请注意编译器警告-它们可能会给您带来提示:将浮点传递给%d整数格式说明符会调用未定义的行为。您知道代码的问题是什么,并且您正在尝试理解错误行为吗?或者您想知道如何修复它?f是浮动的,所以您需要在打印f中使用%f而不是%d。@BenVoigt实际上这是一个竞争性的考试问题。我正在试图理解错误行为。找到一个组织更完善的竞争。第二段需要通过实践或类似方式介绍,因为这当然不能保证。@BenVoigt我想可能有一些体系结构具有双用64位整数/浮点寄存器或纯堆栈调用ABI。x86 stdcall和cdecl调用约定包括在堆栈上传递所有参数的那些,x86和x86_64上的SSE具有双用浮点/整数寄存器。但我更多考虑的是像安腾这样的架构,读取未初始化的值可能导致错误,或者是大小不匹配可能导致页面错误的架构。理论上,甚至可以有一个平台,其中整数值总是通过引用传递,因此寄存器应该包含一个内存地址,而通过存储一个浮点,浮点表示的位形成一个非法地址。