0

我无法理解以下 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 中给了我们反向变量值我从未声明必须打印哪个值......所以有没有理论认为如果我们没有声明必须打印哪个变量然后我们得到变量的反向值我们上面在数据类型中声明...

4

5 回答 5

13

这是未定义的行为,你不应该期待一个特定的输出(或它的解释),除非你关心实现特定的细节。

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

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

于 2013-08-27T07:11:46.570 回答
4

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

于 2013-08-27T07:11:42.147 回答
2

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

于 2013-08-27T07:12:40.997 回答
2

供你参考

int printf( const char* 格式, ... );

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

正如约阿希姆所说,你得到的答案只是运气。你无法预测确切的结果。

于 2013-08-27T07:18:35.623 回答
0

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

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

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

于 2013-08-27T07:11:20.803 回答