在开关块内声明的变量
这个问题在这里已经有了答案:
在这种情况下 ,它不是未定义的行为。
对于case 0
(当expr == 0
,这是你的情况), i
被赋值之前被使用(正在读取的值)。
好的,详细阐述一下这个片段
switch (expr)
{
int i;
case 0:
i = 17;
default:
printf("%dn", 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("%dn", i);
}
标识符为“i”的对象存在自动存储持续时间(在块内),但从未初始化,因此如果控制表达式的值不为零,则对printf函数的调用将访问不确定的值。 [....]
链接地址: http://www.djcxy.com/p/14799.html