Sequencing / Sequence Point란?
c++11부터 Sequence Point가 Sequencing으로 말이 바뀌었다고 한다. 이 글에선 sequence point란 말을 쓰겠다.
모든 연산의 결과가 완료되는 시점
쉽게 말하면, 한 시퀀스 포인트에서 다음 시퀀스 포인트로 가기 전에 이전의 모든 연산이 완료된다는 의미다.
Sequence Point
1. ; (세미콜론)
2. ||, &&, ? : 와 같은 논리 연산
예를 들어, a || b
에서 b가 되기 전에 a의 연산이 모두 완료된다. (a) ? (b) :
는 ?가 sequence point로 무조건 a가 먼저 완료된다.
3. , (쉼표)
a = f1(), b = f2()
와 같이 , 로 연결된 표현
4. 함수의 리턴
함수가 return 되기 전에 모든 연산이 완료된다.
대표적으로 위와 같은 시퀀스 포인트들이 있다.
Sequence Point Rule
1. 이전 시퀀스와 다음 시퀀스 사이에 객체(변수)의 값은 최대 한 번만 바뀔 수 있다.
해당 룰을 어긴 대표적 Undefine behavior
i++ + ++i
+연산자는 Sequence point에 해당하지 않기 때문에 한 Sqeunce에 i++로 한번, ++i로 한번 총 두 번 값이 변경됐다.
i = i++
=연산자 또한 Sequence point에 해당하지 않기 때문에 한 Sqeunce에 i++과 i = 을 통해 두 번 값이 변경됐다.
2. 수정하기 전의 값에 대한 엑세스는 새로 저장할 값을 결정하기 위해서만 일어나야 한다.
해당 룰을 어긴 대표적 Undefine behavior
arr[i] = i++
arr[i]의 값이 증가된 값이 적용될지 아닐지 모른다.
시퀀스 포인트를 적용해보면
f1() + f2() + f3();
과 같은 표현식에서 +는 시퀀스 포인트가 아니기 때문에 어떤 함수가 먼저 실행될지 모른다.
하지만 f1(), f2(), f3();
은 , 가 시퀀스 포인트이기 때문에 f1, f2, f3 순서대로 호출이 된다.
레퍼런스
https://knowledgeforengineers.tistory.com/114?category=916186
'C++' 카테고리의 다른 글
[C++20] auto로 template를 대체해보자 (0) | 2022.07.14 |
---|---|
[C/C++] 잡기술 (0) | 2022.07.07 |
[C/C++] printf에 float만을 위한 변환 명세가 없는 이유 (0) | 2022.04.28 |
[C++] lower_bound vs upper_bound (0) | 2021.10.15 |
[C++] string split구현 (0) | 2021.09.11 |