2015-10-19 6 views
5

Zgodnie z tą książką czytam:switch-case statement bez przerw

P Co się stanie, jeśli pominę przerwę w instrukcji switch-case?

A Instrukcja break umożliwia wykonanie programu, aby opuścić konstrukcję przełącznika. Bez tego wykonanie nadal analizuje następujące opisy spraw.

Załóżmy, że jeśli mam kody patrząc jak

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

Czy to znaczy, jeśli mam wybrać przypadek 1, A i C są zrobione. Jeśli wybiorę przypadek 2, B i C zostaną wykonane. Jeśli ja nie wybiorę żadnej z nich, zrobi się tylko C.

jeśli tak, to co się stanie, jeśli pominąć przerwę po robić C.

Zakładam, są to złe praktyki programowania, ale jestem ciekaw co by się stało, aby uzyskać głębsze zrozumienie jak to wszystko działa. Dzięki

+3

"jeśli wybiorę przypadek 1, A i C zostaną wykonane": Nie wykonano A, B i C. – 101010

+7

Po prostu skompiluj kod testowy, który to zrobi, a dowiesz się, że: p –

+1

Wykonujesz * wszystko * począwszy od wybranego przypadku, aż zobaczysz, że kończy się instrukcja 'break' lub' switch'. Więc może być, że tylko C jest wykonywane, lub B, a następnie C, lub A i B i C, ale nigdy A i C. – Jon

Odpowiedz

2

Przerwa działa jak polecenie "GOTO", lub, co może być lepszym przykładem, podobnie jak przy użyciu funkcji "return" w funkcji "void". Więc odkąd jest koniec, nie ma znaczenia, czy jest tam, czy nie. Chociaż lubię to zawrzeć.

+1

Podejrzewałem to po komentarzach pozostawionych pod pytaniami. To dobre wytłumaczenie, dzięki. – Lost1

+1

Hm, myślę, że podkreślanie "zbliżonej do GOTO" natury 'break' jest ważne. –

+0

@ Kyle Strand Myślałem, że może być lepiej opisane jako powrót w funkcji void ze względu na zakres. –

5

Wykonuje się wszystko, począwszy od wybranego przypadku, aż pojawi się break lub switch. Więc może być tak, że tylko C jest wykonywana, lub B, a następnie C lub A i B oraz C, ale nigdy A i C

+0

dzięki, to jest pomocne. – Lost1

3
  • Jeśli nie to przerwę w żadnym wypadku następnie całą sprawę poniżej zostanie wykonany i dopóki nie zobaczy przerwy.

  • Jeśli nie uwzględnisz rozbicia, nie spowoduje to żadnego efektu, ponieważ nie ma żadnego przypadku poniżej tego "Domyślnego przypadku".

  • I nie używając przerwa powszechnie uważane za złą praktyką, ale jakiś czas może się przydać także z powodu jego upadku przelotowe nature.For przykład:

    przypadku 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. 
    

    przypadku optionB :

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

    przypadek optionC:

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

dziękuję, to jest pomocne. – Lost1

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

jeśli opcja jest 1 to excute wszystko til ona znaleźć break keywrod .. że myśli złamać zakończyć excution z switch ->case Wyjście: A, to B to C więc zaleca się umieścić przerwę po każdym wypadku jak:

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

jeśli opcja jest 1 wyjście będzie: po prostu ..

0

Widziałem w wielu komentarzach i odpowiedziach, że złą praktyką jest pomijanie linii break. Osobiście uważam, że jest to bardzo przydatne w niektórych przypadkach.

Weźmy po prostu bardzo prosty przykład. Prawdopodobnie nie jest to najlepsze, po prostu zrób to jako ilustrację:
- przy złym logowaniu, musisz zalogować nieudaną próbę.
- za trzecią niepoprawną próbę, chcesz się zalogować i zrobić dalsze rzeczy (alert administratora, konto bloku, ...).

Ponieważ czynność jest taka sama dla pierwszej i drugiej próby, nie ma potrzeby, aby między tymi dwoma urządzeniami była break, a ponowne pisanie tych samych poleceń po raz drugi.
Teraz po raz trzeci chcesz robić inne rzeczy, a także logować. Wystarczy zrobić inne rzeczy, po pierwsze, pozwól działać (nie break) poprzez działanie dziennika z pierwszych i drugich próbach:

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++; 
} 

IMHO, jeśli to było taaaaak zła praktyka, aby mieć wspólny kod dla różnych przypadkach Struktura C po prostu by na to nie pozwalała.