Coding/CPP 삽질기2008. 1. 13. 01:33

#include <stdio.h>

int
main(void)
{
    int a = 0;
    int b = 0;
    int c = 0;

    a++ || b++ && c ++ ;
    printf ("a = %d, b = %d, c = %d\n", a, b, c);

    return 0;
}

위 코드를  실행하면 아래와 같이 나온다.
a = 1, b = 1, c = 0

위 와 같은 결과가 나오는 것은 C의 연산자 우선 순위 때문이다.
C 에서는 && 가 || 보다 우선 순위가 높다. 그래서 위의
a++ || b++ && c++ 은 a++ || ( b++ && c++) 와 동일한 문장이다.
Short Circuit에 의해서 먼저 a++이 연산이 되는데,
1) a++이 판단되는데, a = 0 이므로 거짓이 되고, a++ 이 수행되므로  a = 1 이된다.
2) 앞 구문이 거짓이므로 b++ && c++ 가 수행되는데, b = 0 이므로 && 조건에 의해
c++은 수행되지 않는다. 단, b++에 의해서 b = 1 이된다.
그래서 a++ 과 b++만 수행되고, c++은 수행 되지 않으므로
a = 1, b = 1, c = 0 이 된다.

어셈블러로 구현된 코드를 살펴보면 아래와 같다.

    int a = 0;
0040101E  mov         dword ptr [a],0
    int b = 0;
00401025  mov         dword ptr [b],0
    int c = 0;
0040102C  mov         dword ptr [c],0

    a++ || b++ && c ++ ;
00401033  mov         eax,dword ptr [a]
00401036  mov         ecx,dword ptr [a]
00401039  add         ecx,1
0040103C  mov         dword ptr [a],ecx
0040103F  test        eax,eax
00401041  jne         main+5Ch (40105Ch)
00401043  mov         edx,dword ptr [b]
00401046  mov         eax,dword ptr [b]
00401049  add         eax,1
0040104C  mov         dword ptr [b],eax
0040104F  test        edx,edx
00401051  je          main+5Ch (40105Ch)
00401053  mov         edx,dword ptr [c]
00401056  add         edx,1
00401059  mov         dword ptr [c],edx

'Coding > CPP 삽질기' 카테고리의 다른 글

Copy & Paste 신공  (0) 2008.03.08
심심풀이 프로그래밍...2  (0) 2007.09.17
비트 연산자  (0) 2007.04.24
Posted by chobocho