为什么这是非法的:
switch(x) {
case 1:
int a = 1;
break;
case 2:
int a = 2;
break;
}
看起来它本来是合法的。这有什么更深层次的原因是非法的?
答案 0 :(得分:36)
如果不使用break语句,那么我们知道将执行以下情况。因此,如果允许您在两种情况下都声明会导致冲突。例如
switch(x) {
case 1:
int a = 1; // i have removed the break;
case 2:
int a = 2; // now what will happen here :)
break;
}
答案 1 :(得分:29)
因为范围由{
和}
分隔,并且您有a
变量两次。
您可以通过以下方式避免此编译错误:
switch(x) {
case 1: {
int a = 1;
break;
}
case 2: {
int a = 2;
break;
}
}
请注意,在您的示例中,编译器未能成功,因为如果删除第一个break
语句,则可能会发生名为fall-through的事件:
匹配的case标签之后的所有语句都按顺序执行,而不管后续case标签的表达式如何,直到遇到break语句。
在这种情况下,将要执行的语句(由于直通)是:
int a = 1;
int a = 1;
break;
正如您所看到的,a
变量是重复的,这就是您的示例中编译失败的原因。
答案 2 :(得分:8)
这里没有与switch
相关的内容。您根本无法在同一范围内两次声明相同的变量。
这是非法的:
int a = 1;
int a = 2;
现在,让我们假设你想要你的案例分支作为范围。那么问题就是你不能在切换之后(范围之外)使用变量。
答案 3 :(得分:2)
switch语句是一个代码块。 switch语句重新计算它的表达式,然后执行匹配的case标签后面的所有语句。
在这种情况下,它会评估x
,并将其与每个常量进行比较,直到找到匹配项。
但实际上就像在说:
for(int i = 0; i < 4; i++) {
int i = 1;
}
这也行不通,因为i
已经定义。
答案 4 :(得分:1)
每个 case 子句中的变量范围对应于整个开关语句。
但是,如果要使用相同的变量,可以使用花括号{和}在每个case语句中定义自己的块。
答案 5 :(得分:0)
您正在交换机的本地范围内定义a
。因此,您为a
分配了一个值,但是您没有将该值传递到任何位置,因此它似乎是多余的。
如果您要在交换机外声明a
,然后在交换机内调用它,它应该可以正常工作。
int a;
switch(x) {
case 1:
a = 1;
break;
case 2:
b = 2;
break;
}
或者,在每个开关的情况下,你可以操纵你的新int,然后像这样做:
switch(x) {
case 1:
int a = 1;
//do something with your new int here that affects a parameter outside the switch
break;
case 2:
int b = 1;
//do something with your new int here that affects a parameter outside the switch
break;
}
另外,由于冲突,在交换机中多次定义变量似乎是非法的,因为变量a在本地范围内定义为在交换机的第一种情况下意味着一件事。因此,在第二种情况下,您无法将其定义为其他内容。
答案 6 :(得分:0)
继续这些事实:
- &gt;您不能在单个范围内两次声明相同的局部变量。
- &gt; case
不会创建自己的范围。
- &gt; switch
,是创建自己的范围。
- &gt;证明:如果你没有break
一个案例,除非满足条件,否则所有案件都将被执行。 (与其他情况不同)。