2012-02-23 4 views
14

W jaki sposób są traktowane instrukcje, które poprzedzają instrukcje oznaczone etykietą case w bloku . proszę wyjaśnić zachowanie następujących programówJak działa instrukcja switch?

prog1:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    int i=0; 
    case 1:printf("%d",i);   
    } 
getchar(); 
return 0; 
} 

wyjściowe: wartość śmieci.

prog2:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    printf("Inside Switch"); 
    case 1:printf("Case 1\n");  
    } 
    printf("Outside Switch"); 
    getchar(); 
    return 0; 
} 

wyjściowa:

Przypadek 1

zewnętrzny przełącznik.

Instrukcje przed instrukcją oznaczoną jako case wydają się nieosiągalne zgodnie z programem 2, ale dlaczego nie otrzymam błędu dla niezadeklarowanej zmiennej i w pierwszym programie (tylko ostrzeżenie).

Byłoby bardzo pomocne, gdyby ktoś mógł wyjaśnić szczegółowo, w jaki sposób wewnętrznie traktowane jest oświadczenie switch.

+1

Czy to zadanie domowe? To brzmi jak zadanie domowe. Jeśli tak, dodaj tag 'homework' i pokaż swoją dotychczasową pracę. –

+2

@ T.J.Crowder To nie jest praca domowa. Natknąłem się na to podczas robienia quizu C na gildii i jestem ciekawy. – Bazooka

+0

Instrukcja 'switch' jest w zasadzie syntaktycznym cukrem dla tabeli skoków z' goto's. –

Odpowiedz

6

Najlepiej można to wytłumaczyć cytatami ze standardu c. Cytuję odpowiednie części normy, które odnoszą się do twojego pytania tutaj.

6.8.4.2 Instrukcja switch

Para 4:

switch oświadczenie kontrolować przyczyny, aby przejść do, do, lub poza stwierdzeniem, że jest organem switch, zależnie na wartość kontrolującej ekspresji oraz na obecność etykiety default i wartości dowolnych etykiet case na lub w korpusie przełącznika ......

Para 2:

Jeśli switch oświadczenie jest skojarzony case lub default etykietę w zakres identyfikator z zmiennie zmodyfikowanego typu, cała instrukcja switch powinien mieścić się w zakres tego identyfikatora.154)

Przypis:

154) Oznacza to, że deklaracja albo poprzedza instrukcję switch, lub wynika ostatnią case lub default etykietę powiązaną z switch który jest w bloku zawierającym deklarację.

§ 7:
przykład w sztuczej fragmentu

switch (expr) 
{ 
    int i = 4; 
    f(i); 
    case 0: 
     i = 17; 
     /* falls through into default code */ 
    default: 
     printf("%d\n", i); 
} 

obiekt, którego identyfikator i istnieje automatyczny czas przechowywania (w bloku), ale nie jest zainicjowana, oraz tak więc jeśli wyrażenia sterujące mają niezerową wartość, , wywołanie funkcji printf uzyska dostęp do nieokreślonej wartości. Podobnie nie można uzyskać połączenia z funkcją f.


Wspomniany powyżej dotyczy zarówno przykłady kodu w pytaniu.
Example 1, i ma nieokreślony wartość, ponieważ nigdy nie został zainicjowany & stąd drukuje śmieci, podczas gdy w
Example 2, printf połączenie nie zostanie osiągnięty, ponieważ kontrola przeskakuje do pasującego case etykiecie.

+1

dziękuję za to i za inne, na które mi odpowiedzieliście. Bardzo doceniane. – Bazooka

+0

+1. Mam również mały zapis o tym, jak zostaną zaimplementowane przez kompilator, jeśli jesteś zainteresowany, zobacz [tutaj] (http://lazarenko.me/2013/01/13/switch-statement-machine-code/). –

5

Zasadniczo przełącznik działa jak goto na odpowiednią etykietę - instrukcje interweniujące nie są wykonywane. Definicje zmiennych (które faktycznie zdarzają się w czasie kompilacji) zdarzają się, ale jeśli zawierają inicjalizację, to też jest pomijane.

+0

Czy możesz podać przykład kodu. –

2

Nigdy nie zapisuj instrukcji w przełączniku, które nie są częścią żadnej sprawy ani wartości domyślnej, ponieważ nie zostaną wykonane.

UWAGA: deklaracja może być tam napisane, ale nie rachunek (int i; jest deklaracja, ale int i = 10; jest deklaracja + cesja = oświadczenie więc zadanie nie będzie tam wykonać ..!)

switch(a) 
{ 
printf("This will never print"); // this will never executed 
case 1: 
     printf(" 1"); 
break; 

default : 
break; 
} 

zobacz ten Why variables can not be declared in a switch statement just after labels?

+1

Dzięki za link i odpowiedź. – Bazooka