2015-10-19 4 views
5

В соответствии с этой книгой я читаю:Оператор switch-case без перерыва

Q Что произойдет, если я опустил разрыв в операторе switch-case?

A Оператор break обеспечивает выполнение программы для выхода из конструкции коммутатора. Без этого выполнение продолжает оценивать следующие операторы case.

Предположим, если у меня есть коды похожий

switch (option}{ 
    case 1: 
    do A; 
    case 2: 
    do B; 
    default: 
    do C; 
    break; 
} 

Означает ли это, если я выбираю случай 1, А и С сделаны. Если я выберу случай 2, B и C будут выполнены. Если я не выбираю ни одного, то выполняется только C.

если да, то что произойдет, если мы опустим перерыв после сделать C.

Я предполагаю, что это плохо практика программирования, но мне интересно, что произойдет, чтобы получить более глубокое понимание того, как все это работает. Спасибо

+3

«Если я выберем случай 1, делаются A и C»: Нет A, B и C. – 101010

+7

Просто скомпилируйте какой-нибудь тестовый код, который сделает это, и вы обнаружите, что я думаю: p –

+1

Вы выполняете * все *, начиная с выбранного случая, до тех пор, пока не увидите утверждение 'break' или' switch'. Таким образом, может быть, что выполняется только C, или B, а затем C, или A и B и C, но никогда A и C. – Jon

ответ

2

Разрыв действует как команда «GOTO» или, что может быть лучшим примером, это похоже на использование «возврата» на функцию «пустота». Так что, поскольку это конец, не имеет значения, есть ли это там или нет. Хотя я действительно люблю его включать.

+1

Я подозревал это после комментариев, оставшихся под вопросами. Это хорошее объяснение, спасибо. – Lost1

+1

Хм, я думаю, что подчеркивание «GOTO» -образной природы «перерыва» важно. –

+0

@Kyle Strand Я думал, что это может быть лучше описано как возвращение в функции void из-за объема. –

5

Вы выполняете все, начиная с выбранного корпуса до тех пор, пока не увидите break или конец switch. Так может быть, что только C выполняется, или B, а затем C или A и B и C, но никогда и C

+0

спасибо, это полезно. – Lost1

3
  • Если вы не включают перерыв в любом из дела, то все дело ниже будет выполняться и пока он не увидит перерыв.

  • И если вы не включаете перерыв по умолчанию, это не вызовет эффекта, поскольку в этом случае «по умолчанию» нет ни одного случая.

  • И не используя перерыв обычно считается плохой практикой, но через некоторое время он также может пригодиться из-за его падения, через nature.For Например:

    случае optionA:

    //optionA needs to do its own thing, and also B's thing. 
    //Fall-through to optionB afterwards. 
    //Its behaviour is a superset of B's. 
    

    случае optionB :

    // optionB needs to do its own thing 
    // Its behaviour is a subset of A's. 
    break; 
    

    случай optionC:

    // optionC is quite independent so it does its own thing. 
    break; 
    
+0

спасибо, это полезно. – Lost1

2
switch (option}{ 
    case 1: 
    do A; 
    case 2: 
    do B; 
    default: 
    do C; 
    break; 
} 

если ваш вариант 1 это все преобразования приложений сезам это найти break keywrod .. , что означает сломаться конец excution в switch ->case Выход: А, то B, то C поэтому рекомендуется положил перерыв после каждого случая как:

switch (option}{ 
     case 1: 
     do A; 
     break; 
     case 2: 
     do B; 
     break;   
     default: 
     do C; 
     break; 
    } 

если ваш вариант 1 выход будет: просто ..

0

Я видел во многих комментариях и ответах, что это плохая практика, чтобы опустить break строк. Я лично считаю это очень полезным в некоторых случаях.

Давайте рассмотрим очень простой пример. Это, вероятно, не самый лучший, просто возьмите его как иллюстрацию:
- при неудачном входе вам необходимо зарегистрировать неудачную попытку.
- для третьей неудачной попытки вы хотите войти в систему и сделать еще кое-что (alert admin, block account, ...).

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

switch (badCount) { 
    case 3: //only for 3 
     alertAdmin(); 
     blockAccount(); 
    case 2: //for 2 AND 3 
    case 1: //for 1 AND 2 and 3 
     errorLog(); 
     badCount++; 
} 

Имхо, если бы это было тааак плохая практика, чтобы иметь общий код для разных случаев, C-структура просто НЕ допускает.

Смежные вопросы