2014-11-19 2 views
1

Может кто-нибудь, пожалуйста, объясните, почему выход этого кода 4 при х = 0 (я думал, что если х 0, который применяется case 0: и у предположим быть 3 и я не прав в этом случае.Как работает оператор switch в C?

#include <stdio.h> 


int main() 
{ 
    int x = 0; 
    int y; 

    switch (x) { 
    case 0: 
     y = 3; 
    case 1: 
     y = 4; 
     break; 
    default: 
     y = 5; 
     break; 
    } 
    printf("%d", y); 
    getchar(); 
    return 0; 
} 
+0

IMHO, лучший способ увидеть переключатель() как «вычисленный GOTO» – wildplasser

+0

Должен быть список «Ты программист С-Гарри Гарри», когда «и» лицо было подхвачено из-за провальной ошибки в оператор switch, который вы закодировали ». – Persixty

ответ

2

Операторы case предназначены для перехода к следующему случаю в строке, если у них нет оператора break, чтобы вытащить выполнение из всего переключателя. В этом случае вы оценили из заявления излома «случая 0», поэтому выполнение поскользнулся вниз, «Случай 1», который переназначен г до 4.

+0

Спасибо, я понимаю это сейчас. – Impalerz

2

Вы прокомментировали свой break; заявление в своем первом случае заявление

Так просто написать это:

(в противном случае, когда х 0 или 1 г получает назначить до 3, а затем 4)

case 0: 
    y = 3; 
    break; 

Заявление switch относится к следующему break;, если отсутствует один для заявления case! Если вы забыли все из них: D, тогда он останавливается в конце инструкции switch, и все строки get выполняются!

+0

Да, но мне нужно знать, как это работает, когда нет« перерыва »; – Impalerz

+1

@Impalerz, если нет заявления о разрыве, он идет до следующего! – Rizier123

+0

Спасибо, я понимаю это сейчас – Impalerz

1

Поскольку break закомментирована:

switch (x) { 
case 0: 
    y = 3; 
    //break; <---- commented out. 

И каждое неожиданное исполнение новичков происходит только от случая «соответствия», если не встречается разрыв (или возврат).

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

http://en.wikipedia.org/wiki/Duff's_device

999 случаев из 1000, это досадная ошибка, которая будет длиться час, чтобы найти.

3

После switch(x) операция, выполнение переходит к соответствующему заявлению case N. Затем он выполняет код после этой инструкции до тех пор, пока а) не найдет конец границы switch(x), определяемой скобками ({}), или b) он найдет оператор break внутри коммутатора, который завершает этот переключатель.

В вашем случае он прошел через y=3 до case 1, вплоть до y=4 и затем закончилась в break.

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