-1
我的机器下面的代码的输出是奇怪使用%d 6次会给出一个奇怪的输出结果。为什么?
#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();
}
我的机器下面的代码的输出是奇怪使用%d 6次会给出一个奇怪的输出结果。为什么?
#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();
}
也就是说未定义行为。
简短的回答是不这样做,并使编译器警告在编译时-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
,或来电者的回信地址等。
你期望的结果是什么,你要求打印6个数字,你打算打印哪些数字? – pm100