【问题标题】:Why we can not define a variable twice in switch? [duplicate]为什么我们不能在 switch 中定义一个变量两次? [复制]
【发布时间】:2014-02-25 11:51:26
【问题描述】:

为什么这是非法的:

switch(x) {

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

看起来它可能是合法的。这是非法的更深层原因是什么?

【问题讨论】:

  • 你似乎想在切换后引用a。但是a是哪个?
  • 变量范围是游戏的名称。同一范围内不能有两个同名的变量。
  • @dystroy 不,假设我在切换后不需要 a
  • 如果不使用案例 2 中的 break 代码,将作为案例 1 的一部分执行 x=1
  • @Pshemo 但有一个休息时间

标签: java switch-statement


【解决方案1】:

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

switch(x) {

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

【讨论】:

    【解决方案2】:

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

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

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

    请注意,在您的示例中,编译器无法成功,因为如果您删除第一个 break 语句,可能会发生称为 fall-through 的事情:

    匹配的case标签之后的所有语句都按顺序执行,无论后续case标签的表达式如何,直到遇到break语句。

    在这种情况下,将要执行的语句(因为 fall-through)是:

    1. int a = 1;
    2. int a = 1;
    3. break;

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

    【讨论】:

    • 没用:切换后不可用。
    • 一个开关有这样的范围的原因是什么?
    • @dystroy 没用,因为它是语法的最小示例......
    • @Alex 这没有任何原因,这只是 C 样式范围的影响。
    【解决方案3】:

    这里没有与switch 相关的内容。你根本不能在同一个作用域内两次声明同一个变量。

    这是非法的:

    int a = 1;
    int a = 2;
    

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

    【讨论】:

      【解决方案4】:

      每个case子句中变量的作用域对应整个switch语句。

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

      【讨论】:

      • 完美:) !!!!
      【解决方案5】:

      switch 语句是一个代码块。 switch 语句评估它的表达式,然后执行匹配 case 标签后面的所有语句。

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

      但实际上就像是在说:

      for(int i = 0; i < 4; i++) {
          int i = 1;
      }
      

      这也不行,因为i 已经定义了。

      【讨论】:

        【解决方案6】:

        您在交换机的本地范围内定义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;
        }
        

        另外,由于冲突,在 switch 中多次定义变量似乎是非法的,因为变量 a 是在本地范围内定义的,在 switch 的第一种情况下意味着一件事。因此,在第二种情况下,您不能将其定义为其他含义。

        【讨论】:

          【解决方案7】:

          了解以下事实: -> 你不能在一个范围内两次声明同一个局部变量。 ->case 不创建自己的范围。 ->switch,是的,它创建了自己的范围。 ->证明:如果你没有break一个case,除非满足条件,否则所有的case都会被执行。 (不像 else if)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-24
            • 2011-06-26
            • 1970-01-01
            • 1970-01-01
            • 2018-08-24
            • 1970-01-01
            相关资源
            最近更新 更多