为什么我们不能在switch中定义变量两次?

时间:2014-02-25 11:51:26

标签: java switch-statement

为什么这是非法的:

switch(x) {

case 1:
   int a = 1;
   break;
case 2:
   int a = 2;
   break;
}

看起来它本来是合法的。这有什么更深层次的原因是非法的?

7 个答案:

答案 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语句。

在这种情况下,将要执行的语句(由于直通)是:

  1. int a = 1;
  2. int a = 1;
  3. break;
  4. 正如您所看到的,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一个案例,除非满足条件,否则所有案件都将被执行。 (与其他情况不同)。