- 问题描述:
平常写代码过程中常会遇到在switch-case中定义局部变量(如下面的示例中的“case ecolor_red 代码1中定义的temp变量”),但是编译总是无法通过。之前看到书中提到过这个问题,但是好久没写c ,就忘了具体怎么回事,这次用到总算弄明白了。为了以后万一遗忘了方便查阅,特地记录说明。
switch(color)
{
case ecolor_red:
int temp = 10; //1: case中定义局部变量 error;
……
do something;
……
break;
case ecolor_green:
{
int temp = 20; //2: case中定义局部变量 right;
……
do something;
……
}
break;
case ecolor_blue:
cout << "temp = " << temp << endl; //3: 使用前面定义的变量, error
……
break;
default:
……
break;
}
-
ag真人游戏的解决方案:
具体解决办法就像上面代码示例中的“case ecolor_green”的做法,在case中加上“{ }”,将局部变量定义在代码块中,便能解决问题; -
原因:
- 由于 switch中包含的整个代码属于同一个代码块,而不是每个case表示一个代码块。
- 由此带来的问题就是:如果按照上面代码段中第1种情况定义的变量temp,那么同一个代码块中“case ecolor_blue”内部也就可以引用该变量(如上面代码3所示),而如果switch传进来的标记值“color == ecolor_blue”,就会导致在代码3处引用未定义的变量“temp”。vc10编译器比较友好,就会给出提示:“error c2360: “b”的初始化操作由“case”标签跳过”,提示指的就是此处所述的情况。
- 所以上面代码1、3都是错误的,正确使用方式应该按照代码2的做法,把需要用到“temp”变量的代码用大括号括起来,构成代码块,超出该代码块后,该变量失效;