2009-11-05 9 views
4

이 프로그램이 출력되지 않는 이유는 무엇입니까?switch 문에서 변수 선언 및 초기화

#include<stdio.h> 

int main() { 
    int a = 1; 
    switch (a) { 
      int b = 20; 
     case 1: 
     { 
      printf("b is %d\n", b); 
      break; 
     } 
     default: 
     { 
      printf("b is %d\n", b); 
      break; 
     } 
    } 
    return 0; 
} 
+0

무엇이 출력됩니까? –

+3

@Aric - 결과가 도움이되지 않습니다. 초기화되지 않았습니다. –

+0

나는 컴파일러를 설치하는 것이 좋습니다. Cygwin을 개발자 패키지와 함께 설치하고 코드 실행을 시작하면이 모든 것에 대한 답을 얻을 수 있으며 더 빠르고 더 배우게됩니다. – pankajt

답변

30

라인 int b = 20이 실행되지 않습니다 있도록 스위치 문, 관련 케이스로 이동하기 때문에. 스위치를 입력하기 전에

+3

와우이 녀석은 21 평판에서 201lol로 바뀌 었습니다. – Earlz

+3

축하연은 여기 첫날 Rasmus에 있습니다. –

+0

고마워, 크리스, 그리고 모두 "올랐다"! :-) –

0

라인

int b=20;

이 실행되지 않습니다. 20 개의 출력을 얻으려면 switch 문 위로 이동해야합니다.

8

컴파일러에서 경고해야합니다. 'b'의 초기화는 switch 문의 시작 부분에 있으며, 실행되지 않습니다. 실행은 항상 switch 문 헤더에서 일치하는 case 레이블로 직접 이동합니다.

+1

동의. 그렇지 않으면 -Wall 플래그를 추가하십시오. 컴파일러 설명서에서 경고를 활성화하거나 더 나은 컴파일러 (예 : gcc)를 얻으려면 올바른 플래그를 읽지 않습니다. –

+0

예, -Wall로 항상 컴파일하는 것은 매우 좋은 습관입니다. – devin

2

b가 switch 문 내부에 설정되어 있고이 명령이 실행되지 않으므로 "b = 20"을 출력하지 않습니다. 당신이 원하는 것은 이것이다 :

int b = 20; 
switch (a) { 
    case 1: 
    { 
     printf("b is %d\n", b); 
     break; 
    } 
    default: 
    { 
     printf("b is %d\n", b); 
     break; 
    } 
} 
2

GCC는 당신이 스위치를하기 전에 "INT B = 20"를 이동해야하는의 printf()

를 호출 할 때 B를 말하는 경고가 초기화되지 던졌습니다()

2

스위치 내부는 숨겨진 goto 문입니다. 그러니까 기본적으로 무슨 일이 일어나고 있는지 정말

int a=1; 
if(a==1){ //case 1 
    goto case1; 
}else{ //default 
    goto default; 
} 
int b=20; 
case1:.... 
+0

"else"내부는 숨겨진 goto 문입니다. 그래서 기본적으로 실제로 일어나는 일은 ...-) –

+1

글쎄 어셈블리로 떨어질 수 있었고'cmp [a], 1; je case1'하지만 과잉이라고 생각했습니다 – Earlz

2

switch 문의 case 레이블이 이유 "레이블"라고 기억 : 그들은 단지 것과 같은, 거의 보통의 라벨 (label) 할 수 있습니다 goto합니다. 이것은 실제로 switch의 작동 방식입니다. 의 구조화 된 버전으로 switch에서 점진적으로 해당 레이블로 이동하고 거기에서 실행을 계속합니다. 당신의 코드에서는 항상 b의 초기화를 뛰어 넘습니다. 따라서 b은 결코 초기화되지 않습니다.

int b 

b = 20 

이 프로그램을 컴파일 할 때 컴파일러는 B라는 변수를 설정 :

2

코드

int b = 20 

실제로 두 가지 일을하고있다. 이것은 automatic 변수이며 스택에 저장됩니다. 그러나 프로그램 실행이 그 시점에 도달 할 때까지 값을 할당하지 않습니다.

이 시점 이전에는 변수에 어떤 값이 있는지 알 수 없습니다.

전역 변수 또는 static 변수는 프로그램 실행을 시작할 때 초기화됩니다.

+0

이것은 어떻게 관련이 있습니까? 문제는 분명 초기화가 스위치에 배치되어 있기 때문에 도달하지 못했습니다. – Earlz

+3

공정하게하려면 "b"가 여전히 범위에 있다고 (컴파일 시간 이후이므로) 말하고 싶습니다. "int b"부분이지만 할당은 수행되지 않습니다. 즉, 라인이 완전히 무시되지는 않습니다. –

+0

하단 라인은 변수를 선언하고 동일한 코드 행이 둘 다 수행하더라도 해당 변수가 다른 시간에 초기화되도록하는 것입니다. –

1

Compiling with gcc (Using cygwin on Windows) gives a warning message -

warning: unreachable code at beginning of switch statement

and the output is undefined or garbage which clearly says that initialization portion of b is never executed and hence the undefined value.

Note: Question can be raised that if the code or line is unreachable, then why does not we get the error: 'b' undeclared.

The compiler checks for the syntax of the program (above checks if b is declared) and finds it correct (b is declared), although semantically/logically it is incorrect.

Probably in future the compilers may become even more smarter and will be able to detect these kind of errors

+0

@Devil Jin 감사합니다. 거기 좋은 점. – Moeb