我在玩 C;检查一下:
#include <stdio.h>
#include <stdlib.h>
void main() {
printf("%d\n", 1.5);
printf("%f", 0);
}
我期望输出:
0
0.000000
但它打印:
0
1.500000
第一个 printf()
是否将 1.5
传递给第二个 printf()
?
PS:我知道(%d
用于整数,%f
用于 float )。正如我提到的,我只是在搞乱代码。
PS2:我正在使用 DevC++ 和 Code::Blocks。
最佳答案
根据 C 标准,该行为未定义,这是您的系统上可能发生的情况:
- 第一次来电
printf("%d\n", 1.5);
main
传递浮点值1.5
作为第一个 XMM 寄存器中的 double 值并调用printf()
. -
printf()
不修改 XMM 寄存器,因为 if 不执行任何浮点运算来处理格式"%d"
.它从不同的地方检索要打印的值:寄存器或堆栈,而这个值恰好是0
. - 第二次调用
printf("%f", 0);
,main
也不会更改 XMM,因为它传递了int
0
的值通过其他地方,寄存器或堆栈。 - 第二个
printf()
终于得到了double
%f
格式的值来自 XMM 寄存器1.5
之前已经存储了。因此输出1.500000
.
以上都不能以任何方式保证,但这可能是您感兴趣的解释。不同的系统可能以不同的方式处理参数传递,它们是 ABI(应用程序二进制接口(interface))的一部分。
只是为了好玩,您可能想试试这个变体:
printf("first %d, second %f\n", 1.5, 42);
在我的系统上输出first 42, second 1.500000
关于c - C 中连续两次 printf() 调用的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44871982/