片段一:
int sc = 1;
switch (sc)
{
case 0:
int val = 10;
break;
case 1:
val = 5; // error,跳过了初始化
break;
default:
{
}
}
分析: 此时 switch语句跳过case标签0中变量val的初始化语句,直接跳转到case标签1中,此时val = 5;是不允许的,因为val虽然在作用域之内,但是它跳过了该变量的初始化,为非法行为。
片段二:
int sc = 1;
switch (sc)
{
case 0:
int val;
break;
case 1:
val = 5; //right
break;
default:
{
}
}
分析: 相比片段一,标签0中变量val并没有初始化,此时,switch语句直接跳转至标签1,此用法没有问题。
片段三:
int sc = 1;
switch (sc)
{
case 0:
{
int val = 10;
break;
}
case 1:
val = 5; //error, 不在作用域内
break;
default:
{
}
}
分析: 片段三,标签1中的变量val不在作用域内,报错!!
总结: 第一种,如果打算在case标签内定义并初始化一个变量,最好该case标签使用复合语句,即用{}包含在内(推荐使用)
第二种,如果case下不使用{},则case下变量不能初始化;
第三种,在最后一个标签,可定义并初始化一个变量(如果含default,则default才是最后一个标签)。
如果在某一处一个带有初始值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。