Провал, если по умолчанию находится в середине переключателя? - PullRequest
0 голосов
/ 03 января 2019

У меня есть вопрос.В операторе switch проверяется ли default на последний, даже если он не последний?

Если это так, то в следующем фрагменте кода:

int i = 6;
int a=0, b=0, c=0;
switch (i) 
{
    case 1: 
    a++; 
    case 2: 
    default: 
    case 3: 
    b++; 
    case 6:
    c++; 
}
System.out.println(a + " " + b + " " + c); 

После сопоставления с регистром 6 и увеличения значения c, поскольку разрыв отсутствует, вернется ли он к значению по умолчанию?

Я попробовал этот код, и он, похоже, не перешел на дефолт, и провала не произошло.Я просто хотел знать?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

switch вычисляется из соответствия case либо break, либо конца switch оператора.Если вы передадите 6, он введет регистр для 6 и сделает только один шаг.Но если вы введете 7, оно начнется с default и провалится до конца коммутатора с двумя приращениями.

0 голосов
/ 03 января 2019

Дополнительного тестирования меток наблюдений после первоначального тестирования в начале оператора switch не производится. Как только i был оценен оператором switch, управление переходит к метке case 6:, потому что она соответствует i. Затем операторы выполняются по порядку до конца оператора switch или до тех пор, пока не встретится оператор break. Это означает, что увеличивается только c.

Оператор break завершит выполнение только всего оператора switch; наличие оператора break не влияет на повторное тестирование выражения switch, поскольку повторное тестирование выражения switch не будет выполнено в любом случае.

Если вы хотите, чтобы default была введена в качестве метки регистра, тогда i не должна совпадать с любой меткой регистра в начале оператора switch. Если i равно 99 в начале оператора switch, то b и c увеличиваются (происходит падение).

Нет никаких ограничений на то, где в порядке следования меток появляется метка default, только то, что в операторе switch встречается не более одного default.

0 голосов
/ 03 января 2019

В настоящее время все ваши дела будут отклонены, так как ни в одном случае также нет break;, ваш переключатель условно основан на i, поэтому, если вы хотите увидеть каждый случай, вам нужно изменить i.

Использование break; не должно оказывать никакого влияния на то, где ваши дела находятся в состоянии вашего переключателя, это также "случай" для default

Редактировать: Как упомянул @Ivan,если намерен провал, то размещение ваших дел будет иметь значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...