c·c++/c 프로그래밍

printf() 출력 결과에 대해서 어셈블리어 관련시켜 설명 부탁드립니다.

바로이순간 2012. 8. 23. 14:43

void main(){

 int a=4;

 printf("%d %d %d %d\n", a++, a, ++a,a++);

}

 

출력결과 6 7 7 4

 

제가 아는 건 호출규약때문에 printf()의 인자를 거꾸로 읽는 건 아는데 그 이상은 모르겠네요.

자세한 설명 부탁드립니다.

-----------------------------------------------------------------------------------------

[1] printf문에 나오는 인자들은 뒤에서 부터 연산결과를 구합니다.

[2] a++ 형식으로 된 변수의 값은 그 시점의 값을 따로 저장해 두었다가

     출력을 해 줍니다.

[3] ++a 와 a는 a의 변수의 출력시점의 값 자체를 출력해 줍니다.

------------------------------------------------------------

위의 세가지 원칙을 가지고 값이 나오는 것을 보겠습니다.


printf("%d %d %d %d\n", (1) a++, (2) a, (3) ++a, (4) a++);


[1] 번에 따라서 (4)번 부터 연산 결과를 구합니다. a가 원래 가지고 있던 값인 4가 그 결과입니다.

     그리고 나서 a의 값은 5가 됩니다.  [[4를 따로 보관해 둡니다.]]

[1] 번에 따라서 (3)의 값을 구합니다. a는 6이 됩니다. [3] 번에 따라서 나중에 출력할 때의 a의 값을

     출력하게 됩니다.

[1] 번에 따라서 (2)의 값을 구합니다. a는 6입니다. [3] 번에 따라서 나중에 출력할 때의 a의 값을

     출력하게 됩니다.

[1] 번에 따라서 (1)의 값을 구합니다. a가 현재 가지고 있는 값인 6을 따로 저장합니다.

    그리고 나서 a는 7이 됩니다.

=========================================================================

자 이제 출력을 합니다.

(1) 은 6입니다. 

(2)는 출력시점의 a의 값이 7을 출력합니다.

(3) 도 출력시점의 a의 값인 7을 출력합니다.

(4) 는 4를 출력합니다.

*************************************************************************

이렇게 해서 6 7 7 4 가 출력이 됩니다.


컴파일러에 따라서 조금 다를 수 있지만 위에서 이야기한 3가지 방식대로

동작하는 경우가 많기에 이렇게 풀어 봅니다. 그러니까 이해가 되지 않습니까?