2013-08-27 126 views
0

我无法理解以下C程序的输出,有什么想法吗?这一计划的无法理解以下C语言程序的输出

#include<stdio.h> 

#include<conio.h> 

void main() 

{ 
    int a=5,b=6,c=11; 

    clrscr(); 

    printf("%d %d %d"); 

    getch(); 
} 

输出是:

我不明白为什么上面的程序给我们的printf我从未宣布过反向的变量值,其值必须打印...所以有什么理论,如果我们没有宣布哪个变量必须打印,那么我们得到的变量的数据类型的上面声明的反向值...

+10

看起来像我未定义的行为,换句话说,纯粹的运气,它打印甚至远程相关的东西。 –

+1

这是未定义的行为,我确定在某处存在重复。 –

+0

使用另一个编译器试一下,你会得到随机结果(例如clang或gcc) – Geoffroy

回答

13

这是undefined behavior,你不应该指望一个特定的输出(或其解释),除非你关心实现的具体细节。

可能打印的是某些堆栈位置或寄存器中包含的(随机;即“不可预知的”)垃圾值,该堆栈位置或寄存器应该保存参数。

顺便说一句,一些编译器(即GCC当调用gcc -Wall时)会给你一些警告。尽量避免它们(通过纠正源代码)。

+0

当涉及到C或者有一个列表时,是否有很多事情属于未定义行为的范围? – Sid

+5

我认为理解C的定义行为(和语义)比试图列举所有未定义行为的可能情况更重要。 –

0

上述程序的输出取决于编译器。因为它是未定义的行为。

Turbo C会给你预期的输出。在做printf之前尝试做一些操作。你不会得到你所期望的输出。因为printf将打印最近的stack条目。

如果使用gcc under linux编译相同的程序,您将收到警告。

+0

使用'gcc',至少在编译'gcc -Wall'时会在* compile *时间(不是在运行时建议) –

+0

已更新gcc编译器在编译时本身发出警告。我正在使用gcc版本4.6.1(Ubuntu/Linaro 4.6.1-9ubuntu3) – sujin

+0

然后请说“如果你在Linux下使用'gcc'编译相同的程序” –

4

printf使用堆栈来存储和稍后打印数据。在这种情况下,第一一个进去,然后B,然后ç。当printf的弹出元素,第一Ç出来然后b然后一个

2

有一个很好的解释权here。 在运行时,程序只会打印堆栈中的内容,这恰好是您的变量。

2

供您参考

INT的printf(为const char *格式,...);

... - 指定要打印的数据的参数。如果任何参数不是相应转换说明符所期望的类型,或者存在较少格式的参数,则行为是undefined。如果有比要求的格式更多的参数,外来参数进行评估,并忽略

正如Joachim说,你得到的答案是单纯的luck.You无法预测确切的结果。