2017-12-31 137 views
9

다음은 switch 문 예입니다.switch 문에서 다른 케이스 안에 케이스를 넣을 수있는 이유는 무엇입니까?

프로그램 인쇄 위
int main(){ 

    int number1 = 100, number2 = 200; 

    switch(number1){ 
     case 100:{ 
      cout << " outer switch number is: " << number1 << endl; 
     case 200:{ // any value other than 100 
       cout << "inner switch number is: " << number2 << endl; 
      } 
      break;    
     } 
     break;  
    } 

    return 0; 
} 
  • : 100을 다음 case 200의 다음 문을 인쇄 나는이 방법을 왜 작동하지 않습니다. 또한 두 번째 경우에 200 이외의 값이 사용되면 여전히 실행됩니다. case 100 뒤에는 break이 없습니다. 하지만 대신 컴파일 타임 오류가 발생하지 않는 이유는 무엇입니까?

  • 더 명확히 말하면, 내부 케이스의 다른 값도 왜 성공할 것입니까? 예를 들어,

    case 70000: 
    
+1

스위치/케이스는 goto/label을 계산 한 값으로, 몇 가지 추가 제약이 있습니다. – Eljay

+2

'case 100'과 'case 200'사이에 'break'문이 없으므로 fall through가 발생합니다. –

+2

['switch'] 누구나 생각할 수있는 것보다 훨씬 더 불쾌한 일들이 있습니다.] (http://blog.robertelder.org/switch-statements-statement-expressions/). –

답변

9

하지만 왜 내가 대신 컴파일 타임 오류가 발생하지 않습니다?

불법적 인 조치를 취하지 않았기 때문에. case 문은 레이블이 지정된 문입니다. 스위치의 표현식은 점프 할 레이블을 계산하기 위해 평가됩니다 ("점프"및 "레이블"에주의하십시오). 그러면 해당 명령문이 실행을 시작합니다. 솔직히 말하면 변장에 불과합니다. 그것은 좀 더 제한적이지만 점프는 여전히 있습니다.

유일한 제약 조건은 C++이기 때문에 점프하여 개체의 초기화를 건너 뛰지 않아야한다는 것입니다.

이 기능은 Duff's Device (C에도 불구하고)에서 유명하게 사용되었습니다.

더 명확히 말하면, 내부 케이스의 다른 값도 성공할 수있는 이유는 무엇입니까?

점프를 수행 한 후에는 해당 레이블이 중요하지 않습니다. 그들은 단지 구체적인 진술을 표시합니다. 점프 후 실행은 정상적으로 진행됩니다. 정상적인 실행은 레이블이 지정 되었기 때문에 특정 명령문을 피할 수 없습니다.

+0

감사합니다. 그러나'case 0' 또는'case 100000'을 쓰면 모든 값에 대해 작동합니다. ?? – Alex24

+2

@ Alex24 - 아니야. '100'의 경우 외부 블록 실행을 시작합니다. '200'의 경우 외부 블록의 첫 번째 명령을 건너 뛰고 내부 블록으로 점프합니다. '200'을 '10000'으로 변경하면 'number1'이 '100'이므로 외부 블록 실행이 시작됩니다. – StoryTeller

+0

외부가 성공하면 평가되는 내부 값이 무엇이든 성공합니다. – Alex24

1

왜 컴파일 오류가 보이지 않습니까? switch 표현을 올바르게 사용했기 때문입니다. 그러나 원하는 결과를 보지 못할 수도 있습니다. 우선의 간단한 switch 표현을 해보자 :

switch(number1){ 
    case 100: 
     cout<<"the number is 100"<<endl; 
     break; 
    case 200: 
     cout<<"the number is 200"<<endl; 
     break; 
    default: 
     cout<<"the number is neither 100 nor 200"<<endl; 
     break; 
} 

다른 번호를 사용하려면

, 당신은 switch-case 블록에 추가 할 수 있습니다. 휴식을 사용하지 않으면 다음 사건이 목표임을 의미합니다. 휴식을 사용하지 않을 때까지 프로그램이 계속됩니다. default은 위와 같은 경우가 아니라면이 부분을하고 싶다고 말합니다.

의이 프로그램에 가서 무슨 일이 일어나고 있는지 보자

switch(number1){ 
    case 100:{//if the number is 100 it will start from here 
     cout << " outer switch number is: " << number1 << endl; 
     //it will break after the first break expresion 
    case 200:{ // any value other than 100// if the number is 200 it will start from here 
      cout << "inner switch number is: " << number2 << endl; 
     } 
     break; // I meant her is the first break  
    } 
    break;  
} 
0

switch 문은 if 문처럼 작동하지만 2 개 이상 또는 3의 선택을 처리 할 때 그것을하는 것이 바람직하다.

switchcase 문에 대한 조건을 평가합니다.따라서 사건을 발견 할 때마다 조건으로 간주하므로 문장이 끝나는 징후로 발견 될 때까지 계속 실행됩니다. 귀하의 경우에 case 100이 시작되지만 다른 케이스가 100 개에 대한 휴식이없는 한 내부에 있으므로 그 이후의 모든 것이 실행됩니다.

case 100: 
    // do some stuff 
    case 0: 
     // do another stuff 
    case 5779: 
     // do .... 
break; 

알 위의 문은 경우 만 case 100가 성공하면 실행됩니다.

당신이 쓸 수있는 C++로 기억

void foo(){ 
    cout << "foo" << endl: 
} 

int main(){ 

    b: 
     foo();   

    return 0; 
} 
같은

그것은 label하지만 키워드 case와 함께. 또는 앞에 break이없는 case 케이스는 label과 동일한 방식으로 작동합니다.