Могу ли я перейти от одного случая к другому в операторах switch?

#case #switch-statement #break

#switch-statement #break

Вопрос:

Для операторов switch возможно ли изменить значение switch внутри оператора switch, чтобы оно могло переходить к разным случаям? Пример:

 int w = 0;
switch(w)
{
   case 1:
     doSomething();
     w = 3;
   case 2:
     doSomething();
     break;
   case 3:
     doSomething();
     break;
}
  

По сути, я спрашиваю, если я не размещаю оператор break для случая, и я изменяю значение switch в том же случае, будет ли код выполнять оба случая?

Комментарии:

1. Вы пробовали это? Кроме того, почему вы хотите сделать что-то настолько запутанное?

2. @Rafe — Важен дух, почему бы не попробовать?

3. Лучший способ: попробуйте отладить свой код… вы узнаете, что происходит 🙂

Ответ №1:

Да, вы можете изменить значение внутри switch, но он не будет выполнять case для нового значения, пока вы не прервете работу в случае, когда вы изменили значение.

В вашем случае это не произойдет в любом случае, поскольку для 0 нет регистра. Но если вы измените значение на w = 1, то оно будет использоваться для случая 1, а затем для случая 2, поскольку у вас нет break; но оно не будет использоваться для случая 3.

Комментарии:

1. но разве оператор break не отделяется полностью от всего оператора switch?

2. @Andrew: это то, что я говорю, если вы используете break; тогда новое значение ничего не сделает. И если у вас нет break, тогда он перейдет к следующему обращению. Но в любом случае с перерывом или без него; изменение значения не вызовет автоматического вызова соответствующего регистра.

3. итак, в принципе, если я не включу break в оператор case, код выполнит оператор case, соответствующий новому значению, которое я ему присвоил?

4. @Andrew: Нет. изменение значения не вызовет автоматического вызова соответствующего регистра в любой ситуации.

Ответ №2:

Нет, это не изменится и не выполнит инструкцию new case.

Помните, что, как только найдено подходящее совпадение с оператором case, соответствующим значению внутри оператора switch, выполняется этот конкретный случай, и как только это выполняется (если после каждого случая предусмотрен break, чтобы предотвратить провал во всех случаях) , управление возвращается к оператору end of switch .

Пример кода :

 public  class A {
            public static void main(String [] args) {
                    int i=1;
                    switch(i) {
                            case 1 : 
                                    System.out.println("Case 1");
                                    i = 2;
                                    break;
                            case 2 : 
                                    System.out.println("Changed to Case 2");
                                    break;

                             default:
                                    System.out.println("Default");
                                    break;
                            }

                    System.out.println("Final value of i "   i);
            }
    }
  

Вывод :

 Case 1
Final value of i 2  
  

Примечание: Вставив правильные точки останова, попробуйте выполнить отладку. Вы сами узнаете, что именно происходит.

Ответ №3:

Если мы не будем указывать break после каждого случая, то Java начнет выполнение инструкции из соответствующего случая и продолжит выполнение инструкций также для следующих случаев, пока не будет найден оператор break или не встретится конец инструкций switch.

Ответ №4:

Если case 1 произойдет выполнение, это просто провал до case 2 . И поскольку есть break in case 2 , дальнейшего провала не произойдет. Он не переходит к case 3 из-за инструкции w = 3 ; в case 1 .

Ответ №5:

Нет, регистр коммутатора не изменится при изменении значения, в конкретном случае он проверяется только один раз

 let a = 1
    switch (a) {
      case 1:
        console.log("Hello from 1")//only this will be printed 
        a = 2//value of a is changed
        break
      case 2:
        console.log("hello from 2")//this will not execute
        a = 3
        break
      case 3:
        console.log("hello from 3")//this will not execute
        a = 4
        break
      case 4:
        console.log("hello from 4")//this will not execute
        break
      default:
        console.log("default")
    }
    console.log(a)//value will be 2