2013-06-14 7 views
6

Znalazłem poniższy kod podczas googlowania.Kompilator nie podaje błędu dla alternatywnej nazwy dla "domyślnego" przypadku w przełączniku

int main() 
{ 
    int a=10; 
    switch(a) 
    { 
     case '1': 
      printf("ONE\n"); 
      break; 
     case '2': 
      printf("TWO\n"); 
      break; 
     defa1ut: 
      printf("NONE\n"); 
    } 
    return 0; 
    } 

Kompilator nie podaje błędu, nawet jeśli "default" jest zastąpiony przez dowolną inną nazwę. Po prostu wykonuje program i wychodzi z programu bez drukowania czegokolwiek.

Czy ktoś mógłby mi powiedzieć, dlaczego kompilator nie podaje błędu w domyślnym przypadku? kiedy nie jest napisane jako "domyślne"?

Odpowiedz

6

To jest normalna etykieta (goto).

Można to zrobić, na przykład:

int main() 
{ 
    int a=10; 
    switch(a) 
    { 
     case '1': 
      printf("ONE\n"); 
      break; 
     case '2': 
      printf("TWO\n"); 
      break; 
     defa1ut: 
      printf("NONE\n"); 
    } 
    goto defa1ut; 
    return 0; 
} 
+0

: Dziękuję za odpowiedź. Oznacza to, że mogę wejść do tej etykiety goto z innych części programu, nawet jeśli etykieta znajduje się w przełączniku – ponnus

+1

1/To nie będzie działać tak samo, wydrukuje 'NONE', dopóki krowy nie wrócą do domu. 2/Jest to szczególnie złe programowanie, które wydaje się, że przekonałeś OP do użycia. Lepiej po prostu wyjaśnić, dlaczego tak się dzieje i poprawnie zaproponować rozwiązanie "domyślne". – paxdiablo

2

Jeśli używasz GCC, dodać -Wall do opcji.

Twoje oświadczenie jest poprawnym oświadczeniem, deklaruje etykietę. Jeśli użyjesz -Wall, GCC ostrzeże Cię o nieużywanej etykiecie, a nie więcej.

+1

W rzeczywistości może ostrzegać, jeśli typ przełącznika przełącznika jest enum i nie wszystkie przypadki enum są obsługiwane. – wallyk