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

Java 为什么不能在switch中定义两次变量?,java,switch-statement,Java,Switch Statement,为什么这是非法的: switch(x) { case 1: int a = 1; break; case 2: int a = 2; break; } 看起来这可能是合法的。有哪些深层次的原因使其非法呢?这里没有与开关相关的内容。不能在同一范围内两次声明同一变量 这是非法的: int a = 1; int a = 2; 现在,让我们假设您希望,事实上,您的案例分支充当作用域。然后问题是,您将无法在切换后使用变量(超出范围)。因为范围由{和}分隔,并且变量有两次 可以

为什么这是非法的:

switch(x) {

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

看起来这可能是合法的。有哪些深层次的原因使其非法呢?

这里没有与
开关相关的内容。不能在同一范围内两次声明同一变量

这是非法的:

int a = 1;
int a = 2;

现在,让我们假设您希望,事实上,您的案例分支充当作用域。然后问题是,您将无法在切换后使用变量(超出范围)。

因为范围由
{
}
分隔,并且
变量有两次

可以通过以下方式避免此编译错误:

switch(x) {
    case 1: {
        int a = 1;
        break;
    }
    case 2: {
       int a = 2;
       break;
    }
}

请注意,在您的示例中,编译器未能成功,因为如果删除第一条
break
语句,可能会发生调用的情况:

在遇到break语句之前,匹配大小写标签之后的所有语句都将按顺序执行,而不管后续大小写标签的表达式如何

在这种情况下,将要执行的语句(由于失败),包括:

  • inta=1
  • inta=1
  • break

  • 如您所见,
    a
    变量是重复的,这就是在您的示例中编译失败的原因。

    如果不使用break语句,那么我们知道将执行以下情况。因此,如果您在这两种情况下都被允许声明,将导致冲突。比如说

    switch(x) {
    
    case 1:
       int a = 1;  // i have removed the break;
    case 2:
       int a = 2; // now what will happen here :)
       break;
    }
    

    每个case子句中变量的范围对应于整个switch语句


    但是,如果要使用相同的变量,可以使用大括号{和}在每个case语句中定义自己的块。

    您正在开关的局部范围内定义
    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在局部范围内定义为一件事。因此,在第二种情况下,不能将其定义为其他含义。

    switch语句是一个代码块。switch语句计算其表达式,然后执行匹配大小写标签后面的所有语句

    在这种情况下,它计算
    x
    ,并与每个常数进行比较,直到找到匹配项

    但实际上就像是说:

    for(int i = 0; i < 4; i++) {
        int i = 1;
    }
    
    for(int i=0;i<4;i++){
    int i=1;
    }
    
    这也行不通,因为已经定义了
    i

    遵循以下事实: ->不能在单个范围内两次声明同一局部变量。 ->
    案例
    不创建自己的范围。 ->
    开关
    ,yes创建自己的作用域。
    ->证明:如果你不打破一个案例,所有案例都将被执行,除非它们满足条件。(与其他if不同)。

    您似乎希望在切换后参考
    a
    。但是对于哪个
    a
    ?变量范围是游戏的名称。同一作用域上不能有两个同名变量。@不,假设我在切换后不使用
    break
    case 2中的代码将作为
    x=1
    @Pshemo的case
    1
    的一部分执行,但是有一个break它是无用的:切换后没有可用的。切换有这样的作用域的原因是什么?@destroy它是无用的,因为它是一个最小的示例语法…@Alex没有理由,这只是C风格范围的一种效果。完美:)!!!!