2015-01-03 5 views
4

인터뷰에서 다음 코드의 출력을 알아 내야하는 질문이 있습니다. 시도했지만 올바르지 않습니다. 다음 코드를 설명하십시오.while 루프가 두 번 이상 실행되는 이유는 무엇입니까?

#include<stdio.h> 
int main() 
{ 
    int x=0,a; 
    while(x++ < 5) 
    { 
     a=x; 
     printf("a = %d \n",a); 
     static int x=3; 
     printf("x = %d \n",x); 
     x+=2; 
    } 
    return 0; 
} 

출력 : 여기에 무슨 무슨

a = 1 
x = 3 
a = 2 
x = 5 
a = 3 
x = 7 
a = 4 
x = 9 
a = 5 
x = 11 

사람 설명시겠습니까?

+2

루프 본문의 마지막 세 줄에서 정적 내부 변수'x'의 이름을 바꾸면 더 명확하게되는 것을 볼 수 있습니다. –

답변

2

루프 조건부 표현 x++ < 5은 루프 외부에서 선언 된 x을 사용합니다. 문 x += 2;static int x=3;이 이전 선언 x을 숨기기 때문에 루프 외부에서 선언 된 x에 영향을 미치지 않습니다.

즉, static int x=3; 문장 이후의 x에 대한 모든 수정은 루프 제어 표현에 사용 된 x에 영향을 미치지 않습니다.

int x=0,a; 
int y=3; 
while(x++ < 5) 
{ 
    a=x; 
    printf("a = %d \n",a); 
    printf("x = %d \n",y); 
    y+=2; 
} 

xx 숨어 하였다

+0

정적을 제거한 후에도 루프가 5 번 실행됩니다. [link] (http://ideone.com/x1U3Ph) –

+1

@SatishPatel,'static' 또는'not' 루프의'x'는 바깥 쪽'x'를 쉐도우합니다. –

+0

@SatishPatel; '정적'과는 아무런 관련이 없습니다. 루프에서'x'를 재 선언하면 모든 이전 선언이 숨겨집니다. – haccks

1

이 동일하다.

+0

"이것은 ...와 같습니다."- 함수를 두 번 실행하는 경우를 제외하고는 (정적 객체가 두 번 초기화되지 않음). 하지만'main'과는 달리. –

+0

@NikolaiRuhe 네, 그렇지만 우리는 여기에서'정적'으로'y'를 한정 할 수 있습니다. 그러나이 특별한 경우에는 아무 것도 추가하지 않았으므로 제거하려고했습니다. – ouah

2

x++은 현재 값 x을 반환하고 증가합니다. 첫번째 반복에서

,

while(x++ < 5) 

의 상태를 확인한 후

while(0 < 5) 

이어서, x가 증가한다 같은

같다. 따라서 a의 값은 x의 증가 된 값입니다. static x 그림자 (원피)를 x 루프 밖에서 선언 따라서

x+=2; 

static x가 아닌 외부 한 영향을 미친다. 루프에서 선언 된 변수 xstatic이므로 프로그램이 존재하고 범위를 벗어나면 손실되지 않습니다. 3으로 초기화되고 루프의 각 반복에서 2가 추가됩니다.

관련 문제