无法理解以下C语言程序的输出

时间:2013-08-27 07:08:33

标签: c

我无法理解以下C程序的输出,有什么想法吗?

#include<stdio.h>

#include<conio.h>

void main()

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

  clrscr();

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

  getch();
}

该计划的输出是:

  

11 6 5

我无法理解为什么上面的程序给我们printf中的反向变量值我从来没有声明哪个值必须打印...所以有任何理论说如果我们没有声明哪个变量必须打印那么我们得到反向值我们上面在数据类型中声明的变量...

5 个答案:

答案 0 :(得分:13)

这是undefined behavior,您不应该期望特定输出(或其解释),除非您关心特定于实现的详细信息。

可能打印的是一些堆栈位置或寄存器中包含的(随机的,即“不可预测的”)垃圾值。

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

答案 1 :(得分:4)

printf使用堆栈存储并稍后打印数据。在这种情况下,首先 a 进入b然后 c 。当printf弹出元素时,首先出现 c 然后 b < / strong>然后 a

答案 2 :(得分:2)

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

答案 3 :(得分:2)

供您参考

  

int printf(const char * format,...);

     

... - 指定要打印的数据的参数。如果任何参数不是相应转换说明符所期望的类型,或者参数比格式要求的更少,则行为未定义。如果格式所需的参数多于所需的参数,则会评估并忽略无关的参数

正如Joachim所说,你得到的答案仅仅是运气。你无法预测确切的结果。

答案 4 :(得分:0)

上述程序的输出因编译器而异。因为它是未定义的行为。

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

如果使用gcc under linux编译同一程序,则会收到警告。