解释这个C程序的输出

在C拼图中找到了这段代码。

#include int main() { int a=1; switch(a) { int b=20; case 1: printf("b is %d\n",b); break; default:printf("b is %d\n",b); break; } return 0; } 

输出:

  b is 51 

似乎无法理解这个输出..

您通过跳过变量b的初始化来使用具有不确定值的变量( 调用未定义的行为 )。 该程序可以产生任何值,它将是正确的。

C标准甚至涵盖了这种情况(在一个非规范的例子中)。

ISO / IEC 9899:2011§6.8.4.2 switch声明:

7示例在人工程序片段中

 switch (expr) { int i = 4; f(i); case 0: i = 17; /* falls through into default code */ default: printf("%d\n", i); } 

标识符为i的对象存在自动存储持续时间(在块内)但从未初始化,因此如果控制表达式具有非零值,则对printf函数的调用将访问不确定的值。 同样,无法访问函数f的调用。

请注意“不确定值”注释。


关于访问不确定值是否会导致未定义的行为,还有一些讨论空间。 在某些情况下(陷阱表示),它可能导致未定义的行为。 我需要一些时间来确定“可能未定义的行为”是否应被视为“未定义的行为”。 访问未初始化的变量是一个坏主意,并且您无法对代码中打印的值进行任何说明。

b未初始化。 把它放在switch语句之外。

 #include int main() { int a = 1; switch(a) { int b=20; printf("This gets called!\n"); case 1: printf("b is %d\n",b); break; default: printf("b is %d\n",b); break; } return 0; } 

这里的关键是int b=20; 永远不会被召唤。 编译器将创建变量b但它永远不会被初始化。

switch statementprinting except inside case assigning values to the variableprinting except inside case没有什么可以被接受。 如果你想b值将它分配给开关外面。 另外,b值应该像垃圾值一样,在将某些值分配给特定位置之前不能更改。