1598
2014-07-03 10:58:12
1
한 문장에서 ++나 --가 적용되는 변수는 두 번 이상 쓰면 안 됩니다.
또한 한 문장에서 ++나 --가 적용되는 바로 그 변수에 뭔가를 또 대입(=, +=, -= 등)시키면 안 됩니다.
만약 이걸 지키지 않는다면 해당 문장은 Undefined Behavior(정의되지 않은 동작)으로, 컴파일러마다 실행 결과가 달라지게 됩니다.
정의되지 않은 동작은, C++ 표준에서 정해지지 않았다는 뜻입니다.
자세한 설명은
http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points/4183735
여기에 나와 있습니다만 복잡하므로 일단 패스하고 결론만 설명하자면
++와 --의 실행 시점이 세미콜론(;)으로 구분되는 줄 아는 사람, 그리고 그런 식으로 설명하는 사람이 있는데
결론만 말하자면 '틀렸습니다.'
어쩌구 a++ 저쩌구; 는
어쩌구 a 저쩌구;
a = a + 1;
과 같다.
어쩌구 ++a 저쩌구; 는
a = a + 1;
어쩌구 a 저쩌구;
와 같다.
이 설명은 틀렸습니다.
a++은 a를 그 문장에서 사용하고, 그 문장의 계산이 끝나면 a를 1 증가시킨다.
++a은 a를 1 증가시키고, 그 값을 해당 문장에서 사용한다.
이 설명도 틀렸습니다.
http://stackoverflow.com/questions/4445706/post-increment-and-pre-increment-concept
a++는 a를 1 증가시키고 a에 원래 있던 값을 사용합니다.
네? a를 증가시키기 전에 a를 먼저 사용하는 거 아닌가요?
아닙니다. a를 먼저 증가시킬지 a의 원래 값을 사용하는 게 먼저일지는 C++ 표준에서 정의되어 있지 않습니다.
++a는 a를 1 증가시키고 a의 메모리 위치에 있는 값을 사용합니다.
이 정의대로라면, a에 1이 들어 있을 때 ++a + ++a는 (2 + 3)이 될지 (3 + 3)이 될지 (3 + 2)가 될지 정해져 있지 않죠.
a의 메모리 위치에 있는 값이 읽힐 때 다른 ++ 연산자가 이미 처리되었는지 아닌지 모르는 데다가
a + b + c의 연산은 + 연산자의 정의에 따라 앞에서부터 한다고 할 때,
이건 (a + b) + c를 뜻합니다. 그러니까 a와 b의 순서는 정해져 있지 않죠.
a가 어떤 명령을 실행시키는 int형 함수이고 b도 마찬가지일 때
a, b, c 순서로 처리할지
b, a, c 순서로 처리할지
모른다는 거죠.