Published 2022. 5. 1. 19:16

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 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
복사했습니다!