85. 시퀀스 포인트(Sequence Point)
1. 키워드
2. 시퀀스 포인트
- C에서 모든 식의 계산(평가)이 완료되는 지점을 시퀀스 포인트라고 한다.
- 그리고 시퀀스 포인트 사이에서 식의 값은 한 번만 수정될 수 있다.
- 먼저 대표적인 시퀀스 포인트는
;
(세미콜론)인데 다음 코드는 ;
사이에서 값이 두 번 수정된 잘못된 코드이다.
// ↓ 시퀀스 포인트
int i = 0;
i = i++;
// ↑ 시퀀스 포인트
- 코드가 여러 줄로 되어 있지만 중간에 빈 줄은 무시하고
;
사이의 식만 보면 된다.
i = i++
식을 보면 i
는 i = i
에서 값이 한 번 수정되고 i++
에서 다시 수정된다.
i = i
의 결과는 바뀐 것이 없지만 일단 값을 할당했으므로 값이 수정된 것이다.
int i = 0;
//↓ 값이 수정됨
i = i++;
// ↑ 값이 수정됨
- 이 코드는 GCC에서는
Wsequence-point
또는 -Wall
옵션을 사용하여 경고를 출력할 수 있다.
gcc main.c -Wsequence-point
main.c: In function ‘main’:
main.c:7:7: warning: operation on ‘i’ may be undefined [-Wsequence-point]
i = i++;
^
i = i++
와 같이 의도가 명확하지 않은 코드를 정의되지 않은 행동(Undefined Behavior)이라고 부르는데 컴파일러에 따라 결과가 달라질 수 있으므로 이런 코드의 작성은 피해야 한다.
- 물론 다음과 같이
++
연산자를 사용한 뒤 다른 변수에 저장하는 것은 올바른 코드이다.
- 왜냐하면
j
와 i
모두 한 번씩 수정되기 때문이다.
int i = 0;
int j;
j = i++;
References