使用%d 6次给出一个奇怪的输出..为什么?

时间:2015-09-30 12:02:04

标签: c output

我机器上以下代码的输出很奇怪

#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();

}

1 个答案:

答案 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,然后求和,然后求和之前堆栈上的任何内容。这通常是调用函数的局部变量(在本例中为xysum)。事实上,它打印出11和6,对应sumy。另一个%d可能打印出5。

这三个大数字是编译器根据自己的需要添加到堆栈中的东西。它们在调试模式下有意义,但它是特定于编译器的。此外,如果您使用优化(例如-O2)编译代码,它可能会删除部分或全部较大的数字,并且您最终会在堆栈中打印比调用者的本地函数更深的内容,例如当调用者按ebp或调用者的返回地址等