在C Puzzles找到此代码。
#include<stdio.h>
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
似乎无法理解这个输出..
答案 0 :(得分:13)
通过跳过变量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
。
请注意“不确定值”评论。
关于访问不确定值是否会导致未定义的行为,还有一些讨论空间。在某些情况下(陷阱表示),它可能导致未定义的行为。我需要一些时间来确定“可能未定义的行为”是否应被视为“未定义的行为”。访问未初始化的变量是一个坏主意,并且您无法对代码中打印的值进行任何说明。 功能
答案 1 :(得分:2)
b
未初始化。把它放在switch语句之外。
答案 2 :(得分:2)
#include<stdio.h>
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
,但它永远不会被初始化。
答案 3 :(得分:2)
在switch statement
内,我们不会接受assigning values to the variable
和printing except inside case
这样的内容。如果你想b值将它分配给开关外面。另外,b值应该像垃圾值一样,在将某些值分配给特定位置之前不能更改。