我understand为什么我无法在'case'下定义变量,但为什么我可以在'default'下定义一个变量呢?我认为这是另一个标签,就像“案例”一样。
switch(myVar)
{
case 0:
int a = 12; //error
break;
default:
int b = 42; //OK
}
答案 0 :(得分:4)
尝试重新排序您的案例:
switch(myVar)
{
default:
int b = 42; // error
break;
case 0:
int a = 12; // ok
}
现在您将看到编译器抱怨b
,而不是a
。 default
没有什么神奇之处,只是如果你在最后一个case语句中定义变量,那么就没有办法跳过该变量的初始化,所以它完全没问题。这样做。
您可以随时查看案例范围,以便在案例之外无法访问变量,如果这是您的意图:
switch(myVar)
{
case 0: {
int a = 12;
}
break;
default:
int b = 42;
}
答案 1 :(得分:3)
您无法在case 0
下定义它,因为跳转到默认标签(which is what a switch statement does)会跳过a
的初始化。
C ++禁止这样的跳过。如果在块中初始化了变量,那么控制不能到达初始化之后的块内的某个点,而不会预先形成它。
但是,由于int
是没有构造函数的类型,因此如果省略初始值设定项,则可以定义变量:
switch(myvar)
{
case 0:
int a; //OK too
break;
default:
int b = 42; //OK
}
答案 2 :(得分:0)
在switch语句之前初始化所有变量。
int a = 0;
switch(myVar)
{
case 0:
a = 12; //now ok
break;
default:
int b = 42; //OK
}
它与C ++标准有关。 更多信息Cross initialization
答案 3 :(得分:0)
您也可以这样做:
switch(myVar)
{
case 0:
{
int a = 0;
}
break;
default:
int b = 42; //OK
}