2017-01-08 4 views
-1

Так что я некоторое время борется с этим, и я не понимаю, почему это работает.Вложенные операторы case в коммутаторе

int main(void) 
{ 
    int sum = 0; 

    for(int i = 0; i < 10; i++) { 
     switch(i) { 
      case 1: case 4: case 7: sum++; 
      default: continue; 
      case 5: break; 
     } 
     break; 
    } 

    printf("%d", sum); 
} 

Выход:

2 

Я не смог найти какую-либо информацию о вложенных заявлениях дела в другом месте.

+4

«Падение» - это ключевое слово для поиска. (Они на самом деле не «вложены», на самом деле их часто пишут * под * друг друга.) – Biffen

+0

в стороне: получите привычку «ломать каждый» случай. в то время как ваш 'continue' означает, что вам это не нужно, вы можете в конечном итоге сделать что-то более неожиданное, чем падение случая, если вы его пропустите ... Цикл увеличивает' sum' на 'i = 1' и' i = 4' и останавливается на 'i = 5' ...' 0 + 1 + 1 == 2'. если вам не нужен условный поток, но необязательно требуется условное значение, LUT выполняется быстрее и проще: 'sum = 0; for (var i = 0; i <10; i ++) sum + = {1: 1,4: 2,7: 3} [i] || 0; ' – dandavis

+1

Это префект возможность компилировать с помощью символов, запускать код внутри отладчика, чтобы трассировать программу по строке, проверяя значения соответствующих переменных, чтобы узнать, что действительно происходит. – alk

ответ

2
switch(i) { 
    case 1: case 4: case 7: sum++; 
    default: continue; 
    case 5: break; 
} 

выше может быть эквивалентно переписано как

switch(i) { 
    case 1: 
    case 4: 
    case 7: sum++; 
    default: continue; 
    case 5: break; 
} 

Случаи 1 и 4 демонстрируют падения до конца. Это означает, что выполнение переходит к следующему аргументу case. В итоге все три случая выполняются с одним и тем же кодом.

Интересная часть отметить, что default также является допустимой меткой. И он не должен появляться последним! Если вы удалите оператор continue, выполнение будет продолжаться от default до case 5, и цикл завершится, когда i будет 2.

+0

Я не знаю почему, но с 'default:' где-нибудь еще, но в конце действительно дает мне крипы ... ха-ха. –

+1

@LudvigRydahl Годы увиденного в конце сделают это для вас :) Хотя, когда я узнал C, я часто задавался вопросом, почему случай по умолчанию не находится наверху. – StoryTeller

+1

Думаю, да. Ну, теперь, когда вы это скажете, на самом деле это было бы не странно иметь его там. Тем не менее, для меня это проще читать с дефолтом в конце, так как я вижу это как «если все не удается», как в случае «он прошел через все случаи, не соответствовал, так что теперь мы здесь», , Думаю, все сводится к личным предпочтениям. :) –

1

Они не вложены. Это всего лишь три ярлыка для той же инструкции sum++;.

Код перескакивает там в случае i==1 и i==4, следовательно sum становится 2. Значения 0, 2 и 3 приводят к переходу switch на метку default, которая является инструкцией continue;, заставляя цикл выполнять следующую итерацию.

На i==5 переключатель прекращается с внутренними break; команд и выполнение переходит к break после switch(i){...}. Это вызывает завершение цикла, поэтому переменная i никогда не достигает значения 7, а sum остается 2.

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