2013-06-14 2 views
6

Google 검색 중 아래 코드를 발견했습니다.스위치의 '기본'대소 문자에 대해 컴파일러가 오류를 표시하지 않음

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

'default'가 다른 이름으로 바뀌어도 컴파일러에서 오류를 표시하지 않습니다. 단순히 프로그램을 실행하고 아무 것도 인쇄하지 않고 프로그램을 종료합니다.

누구든지 컴파일러가 기본 경우에 오류를주지 않는 이유를 말해 주시겠습니까? '기본값'으로 철자가 지정되지 않은 경우?

답변

6

정상적인 (goto) 레이블입니다.

당신은 예를 들어,이 작업을 수행 할 수 있습니다 : 당신은 GCC를 사용하는 경우

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

: 답변 해 주셔서 감사합니다. 즉, 프로그램의 다른 부분에서이 goto 레이블을 입력 할 수 있다는 의미입니다. 레이블이 switch 문 내에 있더라도 – ponnus

+1

1/동일한 동작을하지 않습니다. 암소가 집에 올때까지 'NONE'이 인쇄됩니다. 2/당신이 OP를 사용할 것으로 확신하는 것처럼 보이는 것은 특히 나쁜 프로그래밍입니다. _why_를 설명하는 것이 더 나을 것이고, '기본'철자법의 해결책을 정확하게 제시 할 것입니다. – paxdiablo

2

이 옵션에 -Wall을 추가합니다.

귀하의 진술은 유효한 진술이며, 그것은 레이블을 선언합니다. -Wall을 사용하면 GCC는 더 이상 사용하지 않는 레이블에 대해 경고합니다.

+1

실제로 스위치 선택기의 유형이 열거 형이고 열거 형의 모든 경우가 처리되지는 않는 경우 경고 할 수 있습니다. – wallyk

관련 문제