#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