본문 바로가기

공대남자/프로그래밍

컴파일러에 따라 다르게 연산되는 증감연산자



증감연산자를 쓰는 이유는 간결성 때문이다. 헌데, 무리한 축소는 화를 불러온다.



다음 수식을 살펴보자.


int a=5, b=5;
b = ++a * a++;




위의 식을 작성한 녀석은 a를 2만큼 증가시키는 것을 원한다.
결론적으로 36이란 값을 얻고 싶은 것이다.

이 녀석의 논리는 다음과 같다.

1. 좌측 a를 증가시킨 값 6과

2. 좌측 a의 증가로 인해 1이 증가한 우측 a 값 6을

3. 서로 곱하여 결과값 36.



얼핏 보면 제대로 된 수식이라 생각할 것이다.

하지만 결과적으로 b에 어떤 값이 저장될 지는 아무도 모르는 것이다.

이유는 어떤 컴파일러를 쓰느냐에 따라 다르기 때문이다.

C에서는 좌측선 계산과 우측선 계산이 따로 정해져 있지 않다.

때문에 좌측선 순서로 계산할 때와 우측선 순서로 계산할 때의 결과값이 완전히 달라지게 된다.

설명하자면,


1. 왼쪽부터 계산
++a      *     a++
1.->6          2.->6
  3.->36


2. 오른쪽부터 계산

++a      *     a++
2.->7         1.->5
  3.->35



이와 같이 전혀 다른 값이 도출됨을 알 수 있다.

따라서 원래 의도한 대로 a값은 2만큼 증가하고 결과값은 36을 제대로 도출하려면

다음과 같이 써야한다.


                                                      a++;
b = a * a;
                                                      a++;


혹은

축약해서


b = ++a * a;
                                                     a++;


b = a * ++a;
                                                     a++;


아니면 이렇게 풀어 써도 상관없다.


a = a + 1;
b = a * a;
a = a + 1;



그러면 결과값은 a = 7, b = 36이 나올 것이다.



어떠한 방법을 쓰든 상관은 없지만 한 가지 주의해야 할 사실은

하나의 수식이나 문장 내에서 같은 변수에 대해서 증감연산을 두 번 이상 적용하면 안된다.



처음 C를 공부할 때 이해하기 힘들었는데 원칙을 알고나니 이것도 별거 아니군.



'공대남자 > 프로그래밍' 카테고리의 다른 글

함수는 참 쉽죠잉  (0) 2010.01.11
74LS194  (3) 2009.11.22
쉽지 않은 재귀함수의 이해  (5) 2009.08.11
하향식 프로그래밍 설계 기법  (1) 2009.08.06
초간단 계산기 프로그램  (0) 2009.07.29