2014-10-15 2 views
4
#include<stdio.h> 
int main() 
{ 
    int n=0, i=2; 
    switch(1) 
    { 
    case 0:do 
      { 
    case 1: n++; 
    case 2: n++; 
      }while(--i > 0); 
    } 
    printf("n = %d",n); 
} 

케이스 1과 케이스 2가 케이스 0에 있고 케이스 1이 케이스 0에 있기 때문에 위의 코드에 대한 출력이 0 일 것으로 예상됩니다. 따라서 실행되지 않으며 케이스 1 또는 2가되지 않습니다.switch case do 중첩 할 때

값은 4가 될 것입니다.

+1

각 사례는 원자 코드 블록이어야합니다. 다른 사례에서는 사례를 중첩 할 수 없습니다. –

+0

@BrianDriscoll : 그게 무슨 뜻이야? 스위치 케이스는 반드시 블록 일 필요는 없습니다. –

+4

http://stackoverflow.com/questions/514118/how-does-duffs-device-work – mafso

답변

7

코드가 루프 중간으로 이동합니다. 그 시점에서, 스위치 문의 사례를 무시, 그래서 n++, n++, 당신은 레이블로 case 생각하는 경우 도움 등 조건, 루프를 확인하지 않습니다, 그리고 switchgoto A와 :

int n=0, i=2; 

    if (1 == 0) 
     goto label0; 
    else if (1 == 1) 
     goto label1; 
    else if (1 == 2) 
     goto label2; 

label0: 
    do { 
     puts("loop"); 
label1: 
     n++; 
label2: 
     n++; 
    } while (--i > 0); 

원본 코드와 마찬가지로이 코드는 label1 (puts) 앞에있는 루프 본문 부분을 건너 뛰고 정상적인 방법으로 루프에 들어간 것처럼 계속됩니다.

+0

@larsmans : 그 경우 설명과 함께 레이블입니다 - 중첩 된 스위치에 문제를 일으키지 않습니다. 외부 스위치와 내부 스위치가 모두 동일한 case 문을 가지고있는 경우. 예 : 케이스 0에 다음을 넣으면 스위치 (i) { case 1 : printf ("here1"); 사례 2 : printf ("here2"); } 이제 label1과 label2는 기능 범위가 있으므로 충돌해야합니다. 이것에 대해 더 자세히 설명해주십시오. FYI - 위에서 수행하는 동안 오류가 발생하지 않습니다. – Sagrian

+1

@Sagrian :'case ... :'레이블은 가장 가까운'switch' 문과 연관되어 있습니다. 애매 모호하지 않습니다. –