运行以下代码:
cpp
#include<iostream>
using namespace std;
int main()
{
int a = 1;
switch (a)
{
case 0:
int b = 0;
break;
case 1:
break;
default:
break;
}
getchar();
return 0;
}
可以得到两个错误:

报错原因 :case 标签之间不允许出现跨越初始化的跳转。简单来说就是变量b在case语句里初始化了,并且编译器认为变量b的作用域范围会影响case1和default,这在C++中是不允许的。
用底层一点的语言解释报错原因,代码如下:
cpp
switch (1)
{
case 0:
int b = 0;
break;
case 1:
b = 0;
break;
}
【变量定义】操作在编译阶段就会执行分配内存,而涉及【变量初始化】操作的语句则必须等到程序运行时才会调用执行,故以上代码会报错,但是以下代码能正常运行,也是这个原因
cpp
switch (1)
{
case 0:
int b;
break;
case 1:
b = 0;
break;
}
解决方法1:在case分支中用花括号 {} 限制变量的作用域,确保该变量的生命周期不会跨越到其他case分支。如下代码所示:
cpp
#include<iostream>
using namespace std;
int main()
{
int a = 1;
switch (a)
{
case 0:
{// 增加花括号限制变量的作用域
int b = 0;
break;
}
case 1:
break;
default:
break;
}
getchar();
return 0;
}
解决方法2: 在switch语句外部声明变量,然后在case分支中进行赋值。
cpp
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b;// 提升作用域
switch (a)
{
case 0:
b = 0;
break;
case 1:
break;
default:
break;
}
getchar();
return 0;
}
解决方法3: 将包含变量初始化的代码封装到函数中,然后在case分支中调用函数。
cpp
#include<iostream>
using namespace std;
// 封装变量
void ToB()
{
int b = 0;
}
int main()
{
int a = 1;
switch (a)
{
case 0:
ToB();// 调用函数
break;
case 1:
break;
default:
break;
}
getchar();
return 0;
}