1. Sequencing / Sequence Point란?
c++11부터 Sequence Point가 Sequencing으로 말이 바뀌었다고 한다. 이 글에선 sequence point란 말을 쓰겠다.
모든 연산의 결과가 완료되는 시점
쉽게 말하면, 한 시퀀스 포인트에서 다음 시퀀스 포인트로 가기 전에 이전의 모든 연산이 완료된다는 의미다.
2. Sequence Point
1. ; (세미콜론)
2. ||, &&, ? : 와 같은 논리 연산
예를 들어, a || b
에서 b가 되기 전에 a의 연산이 모두 완료된다. (a) ? (b) :
는 ?가 sequence point로 무조건 a가 먼저 완료된다.
3. , (쉼표)
a = f1(), b = f2()
와 같이 , 로 연결된 표현
4. 함수의 리턴
함수가 return 되기 전에 모든 연산이 완료된다.
대표적으로 위와 같은 시퀀스 포인트들이 있다.
3. 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 순서대로 호출이 된다.
4. 레퍼런스
https://knowledgeforengineers.tistory.com/114?category=916186
[C Language] Sequence Point (시퀀스 포인트)
시퀀스 포인트 시퀀스 포인트는 C언어 계열의 언어에서 매우 중요한 개념이므로, 두가지 주요 문서를 번역해서 정리하고자 한다. 다음은 C FAQ 3.8번 질문을 번역한 것이다. A sequence point is a point in
knowledgeforengineers.tistory.com
'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 |