증감연산자에대한 질문입니다.

amwool83의 이미지

int a = 10;
int result;

result = a++ + a;

printf("%d \n", result);

위 코드에서 result변수에 왜 21이 대입되는지 이해가 안됩니다..

a + a를 먼저 연산된 20에 20++이 되는건지.. 20++이 되었으면 a는 왜 증가한건지?

그래서 a++ + a++도 테스트해보았는데 이것도 21이 대입됩니다

이해가 잘 안가네요 ㅠㅠ

...!의 이미지

사실 정확하고 일반적인 답변은 간단치 않습니다.

http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points

를 참고하세요. 영어라는 것만 빼면 좋은 설명입니다. C를 제대로 공부하고 싶다면 읽어볼만한 가치가 있습니다.

결론만 말씀드리자면 이 프로그램은 행동이 정확히 정의되지 않은 프로그램입니다. 결과로 어떤 수가 나와도 이상하지 않습니다. 고로 증감연산자를 이런 식으로 사용해서는 안됩니다.

참고로 gcc 에 -Wall 플래그를 주고 위 프로그램을 컴파일하면 경고를 띄웁니다.

warning: operation on ‘a’ may be undefined [-Wsequence-point]
result = a++ + a;
          ~^~

clang도 마찬가지이구요.

warning: unsequenced modification and access to 'a' [-Wunsequenced]
result = a++ + a;
          ^    ~

항상 -Wall 플래그를 사용하시고, 경고에 주의를 기울이는 것이 좋습니다.

라스코니의 이미지

사람마다 견해가 다르겠지만 제가 추천드리고 싶은 것은 result = a++ + a; 와 같은 이해하기 곤란한 문장은 사용하지 말라는 것입니다.

a++;
result = a;

식으로 쓰시면 만사가 편합니다.