CAFE

펌글

[뉴스그룹]++i 와 i++ (글쓴이 : 김승범)

작성자김태우|작성시간03.07.22|조회수841 목록 댓글 0

ktlsu1231 wrote:
>
> 안녕하세요.
> ++i와 i++ 의 정확한 차이를 알고 싶어요.
> ++i는 자기자신에 1을 더하면서 시작하고
> i++은 자기자신 수 부터 시작 그 다음부터 1을 더해
> 사용하는 건가요?
> for 루프에 위 두가지 경우를 적용해서
> printf함수로 i값의 변화를 출력해보면 값이 같게 나와서요.
> 부탁드립니다. 감사합니다.

i가 증가된다는 것은 마찬가지입니다만, 식 자체의 값이 무엇이 되느냐가
다릅니다. "pre-increment"라고 불리는 ++i의 값은 증가된 후의 값이고
"post-increment"라고 불리는 i++의 값은 증가되기 전의 값입니다.

int i = 0;
int a = i++; // a는 0이 되고 i는 1만큼 증가하여 1이 됨
int b = ++i; // i는 1만큼 증가하여 2가 되고 b는 2가 됨

이렇게 증가식 자체의 값이 사용되는 경우에는 두 식이 차이가 있으나
단순히 부작용만을 바라는 경우(대표적으로 for 문의 세번째 식)에는
두 식의 차이가 드러나지 않게 됩니다.

i++; // i를 1만큼 증가시킨다.
++i; // i를 1만큼 증가시킨다.

참고로 값의 증가는 바로 전 sequence point와 바로 후 sequence point
사이에 일어난다는 것만 정의되어 있으며, 여러 대상체에 대한 증가 연산이
인접한 두 sequence point 사이에 섞여 있을 때 이들의 증가 순서는
정의되어 있지 않습니다. 즉 (a++ + b++ + c++)와 같은 식에서 a, b, c의
증가 순서는 정의되어 있지 않습니다.

그리고 인접한 두 sequence point 사이에 하나의 대상체의 값은 최대
한 번까지만 수정될 수 있으며, 수정되는 대상체의 이전 값은 새로운
값을 결정하는 용도로만 읽힐 수 있습니다. 즉 (++i + ++i)라든지
(i + i++)와 같은 식의 결과는 예측할 수 없습니다. 일부 교재에서
pre-increment와 post-increment의 의미를 잘 이해했는지 시험하기 위해
이러한 식이 어떤 결과를 낳는지 묻는 경우가 있습니다만, 이와 같은
undefined behaviour의 결과를 따지는 것은 무의미합니다.

이미 설명에서 등장했지만, pre-increment와 post-increment의 정확한
의미와 사용상의 제한은 sequence point라는 개념을 이해하지 못하고는
알 수 없습니다. sequence point는 간단히 말해 연산의 부작용이
끝마쳐져야 하는 시점이라 할 수 있으며, C90의 Annex C에서는 다음과
같은 경우가 sequence point에 해당한다고 밝히고 있습니다.

The following are the sequence points described in 5.1.2.3.

* The call to a function, after the arguments have been eval‎uated
(6.3.2.2).

* The end of the first operand of the following operators:
logical AND && (6.3.13); logical OR || (6.3.14);
conditional ? (6.3.15); comma , (6.3.17).

* The end of a full expression‎: an initializer (6.5.7);
the expression‎ in an expression‎ statement (6.6.3);
the controlling expression‎ of a selection statement (if or switch) (6.6.4);
the controlling expression‎ of a while or do statement (6.6.5);
each of the three expressions of a for statement (6.6.5.3);
the expression‎ in a return statement (6.6.6.4).

--
김승범
다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼