2014-02-23 2 views
-1
int main(void) { 
    int i = 2, k = 3, a; 
    i++; 
    ++k; 
    { 
     int i = 0; 
     i = k++; 
     printf("%d,%d,", i, k); 
    } 
    printf("%d,%d", i, k); 
    getchar(); 
    return 0; 
} 

왜이 코드는 "4,5,3,5"출력을 생성합니까? "4,5,4,5"가 아닌 이유는 무엇입니까? 왜 내가 f7 키 C++ 코드를 추적 할 때 먼저 printf 다음 second printf(). 그래서이 변수의 값에 따라 4를 유지해야합니다. 그러면 왜 두 번째 printf() 함수에서 변수 3의 값을 제공합니까?중괄호 사이의 코드와 변수 값 변경

+0

범위, 범위, 범위, 범위는 ... – devnull

+0

'중괄호에 선언 i'는'은'main' 범위에서 선언 i'되지 않습니다. 마치 'i1'과'i2'처럼 생각할 수 있습니다. – rullof

+0

주 기능과 중괄호 안에 'i'를 의미합니다. 두 경우 모두 다른 메모리 위치에 다른 메모리 주소로 저장되어 있습니까? –

답변

1

두 번째 printfi이 으로 선언 되었기 때문에 i이 중괄호에 의해 작성된 다른 범위에 있기 때문에 표시되지 않습니다.

그래서, 제 printfint i =2 같이 i++으로 3 증가에 다음 행에 선언 (및 지정) 된 제 i을 걸린다.

그건 그렇고, 코드 들여 쓰기는 당신의 친구입니다 (우리도 마찬가지입니다 :).

+0

코드 들여 쓰기 란 다음과 같은 코드를 작성하는 것을 의미한다. 적절한 방법은 적절한 탭 공간을주고 코멘트 등을 추가하는 것을 의미합니까? –

+0

@AndroidDeveloper 적절한 탭 공간을 제공하므로 코드가 더 읽기 쉽습니다. 사람들이 게시물을 멋지게 수정 한 방법에 주목하십시오. 이제 훨씬 나아졌습니다. [더 읽을 거리] (http://en.wikipedia.org/wiki/Indent_style). –

1

중괄호는 블록을 구분하고 C 변수는 블록에 로컬이기 때문에.

따라서 두 번째 i은 내부 블록에 국한되며 첫 번째 블록과 다르며 기능 main에 국한됩니다.

는 코드의 주석 버전으로보세요 : C

main(){ 
    int i =2,k=3,a; 
    i++; // i = 3 
    ++k; // k = 4 
    { 
    int i =0; // Lets call it i', then i' = 0 (it is different to i) 
    i=k++; // i' = k = 4, then increment k so k = 5 
    printf("%d,%d,",i,k); // Prints i', k: "4,5," 
    } 
    printf("%d,%d",i,k); // Prints i, k: "3,5" 
    getch(); 
} 
0

중괄호 블록 범위를 정의합니다. 따라서 중괄호로 구분 된 블록의 i은 바깥 쪽 블록과 다릅니다. 귀하의 코드를 약간 수정하고 도움이되는 곳에 의견을 추가하고 있습니다.

// main should return int. void type should be explicit in the parameter list 

int main(void) { 
    int i = 2, k = 3, a; 
    i++; // i is 3 
    ++k; // k is 4 
    {       // block scope starts 
     int i = 0;    // not the same as the previous i 
     i = k++;     // block level i is 4 as k is 4 
     printf("%d, %d", i, k); // prints 4, 5 
    }       // block scope ends 
    printf("%d, %d", i, k);  // prints 3, 5 
    getchar();     // getch is nonstandard. use getchar instead 
}