#include <stdio.h>
int main()
{
int expr = 0;
switch (expr)
{
int i;
case 0:
i = 17;
default:
printf("%d\n", i);
}
return 0;
}
在上面的代码中,变量i
在switch case block中声明并打印成默认情况。使用以下命令在linux平台上的GCC编译器中编译。
gcc -Wall switch.c
并且打印输出正确。
那么,是定义了行为还是未定义的行为?
答案 0 :(得分:4)
在这种情况下,它不是未定义的行为。
对于case 0
(expr == 0
,这是您的情况),{em} 之前会为i
分配一个值(正在读取值)。< / p>
好的,再详细说明一下,对于片段
switch (expr)
{
int i;
case 0:
i = 17;
default:
printf("%d\n", i);
}
只是在块作用域中定义变量i
。即使代码将被写为
int i = 0; //or any value
i
的值未初始化,只是标识符在范围内可见。在使用它之前,您必须有另一个语句为i
赋值。
在这方面,C11
标准有一个非常有启发性的例子和描述。让我引用它,来自章节§6.8.4.2/ P7
示例在人工程序片段中
switch (expr) { int i = 4; f(i); case 0: i = 17; /* falls through into default code */ default: printf("%d\n", i); }
标识符为`i的对象存在自动存储持续时间(在块内)但从未初始化,因此如果 控制表达式具有非零值,即对printf的调用 函数将访问不确定的值。 [....]