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;
식으로 쓰시면 만사가 편합니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
사실 정확하고 일반적인 답변은 간단치 않습니다.
사실 정확하고 일반적인 답변은 간단치 않습니다.
http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
를 참고하세요. 영어라는 것만 빼면 좋은 설명입니다. C를 제대로 공부하고 싶다면 읽어볼만한 가치가 있습니다.
결론만 말씀드리자면 이 프로그램은 행동이 정확히 정의되지 않은 프로그램입니다. 결과로 어떤 수가 나와도 이상하지 않습니다. 고로 증감연산자를 이런 식으로 사용해서는 안됩니다.
참고로 gcc 에 -Wall 플래그를 주고 위 프로그램을 컴파일하면 경고를 띄웁니다.
clang도 마찬가지이구요.
항상 -Wall 플래그를 사용하시고, 경고에 주의를 기울이는 것이 좋습니다.
사람마다 견해가 다르겠지만 제가 추천드리고 싶은 것은
사람마다 견해가 다르겠지만 제가 추천드리고 싶은 것은 result = a++ + a; 와 같은 이해하기 곤란한 문장은 사용하지 말라는 것입니다.
a++;
result = a;
식으로 쓰시면 만사가 편합니다.
댓글 달기