在C拼图中找到此代码.
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
b is 51
Run Code Online (Sandbox Code Playgroud)
似乎无法理解这个输出..
Jon*_*ler 13
您通过跳过变量的初始化来使用具有不确定值的变量(调用未定义的行为)b.该程序可以产生任何值,它将是正确的.
C标准甚至涵盖了这种情况(在一个非规范的例子中).
ISO/IEC 9899:2011§6.8.4.2
switch声明:7示例在人工程序片段中
Run Code Online (Sandbox Code Playgroud)switch (expr) { int i = 4; f(i); case 0: i = 17; /* falls through into default code */ default: printf("%d\n", i); }标识符
i存在的对象具有自动存储持续时间(在块内)但从未初始化,因此如果控制表达式具有非零值,则对printf函数的调用将访问不确定的值.同样,无法访问函数调用f.
请注意"不确定值"注释.
关于访问不确定值是否会导致未定义的行为,还有一些讨论空间.在某些情况下(陷阱表示),它可能导致未定义的行为.我需要一些时间来确定"可能未定义的行为"是否应被视为"未定义的行为".访问未初始化的变量是一个坏主意,并且您无法对代码中打印的值进行任何说明.