关于C/C++中switch语句case中变量不能初始化赋值的问题
这里我写了一个测试
比如:
#include <iostream>
using namespace std;
int main()
{
int op;
cin >> op;
switch (op)
{
case 1:
int a = 1;
break;
case 2:
a = 2;
break;
case 3:
a = 3;
break;
default:
break;
}
return 0;
}
这会报错!编译器会提示如下错误error C2361: “default”标签跳过“a”的初始化操作
将代码int a=1;改为int a; a=1;编译器就不再提示错误。
如下:
#include <iostream>
using namespace std;
int main()
{
int op;
cin>>op;
switch(op)
{
case 1:
int a;
a=1;
break;
case 2:
a = 2;
break;
case 3:
a = 3;
break;
default:
break;
}
return 0;
}
也可将代码改成如下,编译器不提示错误。
#include <iostream>
#include <iomainp>
using namespace std;
int main()
{
int op;
cin>>op;
switch(op)
{
case 1:
int a;
break;
case 2:
a=2;
break;
case 3:
a = 3;
break;
default:
break;
}
return 0;
}
在 上述会报错的原代码中如果在case‘0’中进行了变量a的声明,且同时初始化了( int a = 1; ),而当其他dcase:中进行了使用(赋值)时,这会发生作用域错误。
错误原因:
switch里面的语句属于同一作用域范围,即case 1里面只声明(int a)的变量在switch任何范围都是可以使用的,理论上case 2也可以使用case 1的未初始化变量。
但是如果变量a的声明的同时初始化了在case 1里面,但是op直接等于2、3、4.....的话,就没有运行case 1的语句,这样的话就会导致变量还没有定义,所以会报错误!
而!!!
C++规定:不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。这就要求我们在case
语句中不能对变量进行初始化操作(可以进行声明定义,声明定义是在编译时期发生的,所以无论如何都无法跳过,但是初始化是可以跳过的,但是这种操作是不被允许的)。
解决:
如果我们想要在case
语句中定义并初始化一个变量,
则解决方案有两种
1.case中如有变量初始化,一定要加 {} ,变量定义在块内,从而确保后面所有的case
标签都在变量的作用域之外
为什么?
加上{}就是新的作用域了,C89,ANSI C只能在新的作用域开始处定义变量
2.可把初始化放在switch之前
注意:int类型和用户自定义类型,实质都是一样的。都属于数据类型,只不过一个是简单数据类型,一个是复合数据类型
3.将需要的部分写成一个函数 (本质还是方法一)