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

无法理解以下C语言程序的输出,c,C,我不能理解下面C程序的输出,知道吗 #include<stdio.h> #include<conio.h> void main() { int a=5,b=6,c=11; clrscr(); printf("%d %d %d"); getch(); } 该程序的输出为: 116 5 我不明白为什么上面的程序在printf中给我们反向变量值,我从来没有声明哪个值必须打印…所以有没有任何理论,如果我们没有声明哪个变量必须打印,那么我们得到的变量的

我不能理解下面C程序的输出,知道吗

#include<stdio.h>

#include<conio.h>

void main()

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

  clrscr();

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

  getch();
}
该程序的输出为:

116 5


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

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

Turbo C将提供您期望的输出。在执行printf之前,请尝试执行一些操作。您将无法获得预期的输出。因为printf将打印最近的堆栈条目


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

printf使用堆栈存储和稍后打印数据。在这种情况下,首先a进入,然后b进入,然后c进入。当printf弹出元素时,首先c进入,然后b进入,然后a进入,这就是,除非您关心具体实现的细节,否则您不应该期望得到特定的输出或解释

可以打印的是随机的;i、 e.某些堆栈位置或寄存器中包含不可预测的垃圾值,这些堆栈位置或寄存器应包含参数


顺便说一句,一些编译器,例如当使用gcc-Wall调用时,会给您一些警告。尽量通过修改源代码来避免它们。

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

供您参考

int printf const char*格式

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


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

在我看来像是未定义的行为,换句话说,纯粹是运气,它打印出了一些甚至毫不相关的东西。这是未定义的行为,我肯定在某个地方有重复的地方。使用另一个编译器尝试同样的方法,你会得到随机的结果,例如,clang或gccIs。当涉及到C或有一个列表时,很多东西都属于未定义行为的范畴?我相信理解C的定义行为和语义比尝试列举所有未定义行为的可能情况。使用gcc,您会在编译时收到警告,而不是在运行时收到警告,至少在使用gcc编译时会收到警告-更新的gcc编译器会在编译时发出警告。我使用的是gcc版本4.6.1 Ubuntu/Linaro 4.6.1-9UBUNTU3,请说明您是否在Linux@BasileStarynkevitch谢谢你纠正我。我没有通知就把它打了。