我机器上以下代码的输出很奇怪
#include <stdio.h>
void main() {
int x = 5,y=6,sum=0;
sum=x+y;
printf("%d %d %d %d %d %d", sum = x +y );
getch();
}
答案 0 :(得分:4)
那是未定义的行为。
简短回答是不要这样做,并启用编译器警告,以便在编译时-Wformat
或-Wall
检测到它。
答案很长:
函数声明是:
int printf(const char *format, ...);
意思是它知道第一个参数是格式,之后可能会有更多。它会扫描format
字符串,并且对于每个说明符(例如%d
),它会尝试从与该类型对应的堆栈中删除数据(在本例中为int
)。
调用您的函数时,您会执行以下操作:
push sum
push const_format_string_pointer
call printf
在printf中,它首先读取const_format_string_pointer,然后求和,然后求和之前堆栈上的任何内容。这通常是调用函数的局部变量(在本例中为x
,y
,sum
)。事实上,它打印出11和6,对应sum
和y
。另一个%d
可能打印出5。
这三个大数字是编译器根据自己的需要添加到堆栈中的东西。它们在调试模式下有意义,但它是特定于编译器的。此外,如果您使用优化(例如-O2
)编译代码,它可能会删除部分或全部较大的数字,并且您最终会在堆栈中打印比调用者的本地函数更深的内容,例如当调用者按ebp
或调用者的返回地址等