【发布时间】:2021-08-12 22:43:39
【问题描述】:
【问题讨论】:
-
请将所有内容作为文本直接放在您的问题中,而不是图像,也不是指向非官方图像的链接。
【问题讨论】:
现在许多架构/操作系统/ABI 的参数传递约定都是基于寄存器的,至少对于前几个参数。大多数架构上的整数和浮点使用完全独立的寄存器。当您告诉它打印%f 时,它会在浮点寄存器中查找,但作为int 的参数是在整数寄存器中传递的;他们根本看不到对方,所以你甚至不会得到“半垃圾”(其中一些是被解释为浮点的整数位),它是“完全垃圾”(你看到任何发生的事情都被抛在后面上次使用时在该寄存器中)。
在你的情况下它是0.0,但它可能在下一次运行时有所不同,或者由不同的编译器构建,或者受月相的影响等。这是未定义的行为,所以 C/C++ 规范不不必费心得到比这更详细的了。
【讨论】:
首先,您的假设通常是不正确的。整数和浮点数在作为参数传递给可变参数函数时都会被提升,因此假设现在最常见的架构,它们的大小都会变成 8 字节。
话虽如此,这段代码会触发未定义的行为,因为您正试图将浮点数的二进制表示视为整数。未定义的行为可能会产生看似随机的观察效果,在您的情况下,打印的是 0 - 但从语言的角度来看,它是完全随机的。
【讨论】: