C++:switch case 中的初始化并不总是给出错误
C++: Initialization within switch case is not consistently giving out error
我读到在 switch 情况下的初始化应该会导致编译器错误。
但是当我尝试两个不同的版本时。一个是不报错(Ex1),我不明白为什么。
示例 1:
switch (i)
{
case 1:
int k;
break;
case 2:
int j=3;
break;
}
Ex2:
switch (i)
{
case 1:
int k=3;
break;
case 2:
int j;
break;
}
在 switch 块中,case
之前的每个声明在 case
处可用。当有一个 case
时,switch
可以跳转到该 case
,而该 switch
位于您可以在那里访问的变量初始化之后。如果跳转到 case
,您可以使用该变量,尽管它从未发生过初始化。
在第一个示例中,没有 case
会跳过初始化。唯一的初始化是 int j=3;
,它在每个 case
之后出现,所以它不能被跳过。 k
未初始化,因此无法跳过其初始化。
在第二个例子中,如果 i == 2
那么 k
的初始化将被跳过。
一个解决方案是为每个案例定义一个范围。那么,为 case
定义的变量只能从 case
访问,问题就不会发生。例如:
void foo(int i)
{
switch (i)
{
case 1:
{
int k=3;
break;
}
case 2:
{
// k is not accessible here
int j;
break;
}
}
}
我读到在 switch 情况下的初始化应该会导致编译器错误。 但是当我尝试两个不同的版本时。一个是不报错(Ex1),我不明白为什么。
示例 1:
switch (i)
{
case 1:
int k;
break;
case 2:
int j=3;
break;
}
Ex2:
switch (i)
{
case 1:
int k=3;
break;
case 2:
int j;
break;
}
在 switch 块中,case
之前的每个声明在 case
处可用。当有一个 case
时,switch
可以跳转到该 case
,而该 switch
位于您可以在那里访问的变量初始化之后。如果跳转到 case
,您可以使用该变量,尽管它从未发生过初始化。
在第一个示例中,没有 case
会跳过初始化。唯一的初始化是 int j=3;
,它在每个 case
之后出现,所以它不能被跳过。 k
未初始化,因此无法跳过其初始化。
在第二个例子中,如果 i == 2
那么 k
的初始化将被跳过。
一个解决方案是为每个案例定义一个范围。那么,为 case
定义的变量只能从 case
访问,问题就不会发生。例如:
void foo(int i)
{
switch (i)
{
case 1:
{
int k=3;
break;
}
case 2:
{
// k is not accessible here
int j;
break;
}
}
}