C Language
시퀀스 포인트
수색…
비고
국제 표준 ISO / IEC 9899 : 201x 프로그래밍 언어 - C
휘발성 객체 액세스, 객체 수정, 파일 수정 또는 이러한 작업 중 하나를 수행하는 함수 호출은 모두 부작용 이며 실행 환경의 상태 변화입니다.
표현식 A와 B의 평가 사이의 시퀀스 포인트 의 존재는 A와 관련된 모든 값 계산 및 부작용이 B와 관련된 모든 값 계산 및 부작용이 발생하기 전에 순서화된다는 것을 의미합니다.
다음은 C 언어 표준 온라인 2011 초안 초안 의 부록 C에있는 전체 시퀀스 목록입니다.
시퀀스 포인트
1 다음은 5.1.2.3에 설명 된 순서 지점입니다.
- 함수 지정자의 평가와 함수 호출 및 실제 호출의 실제 인수 사이. (6.5.2.2).
- 다음 연산자의 첫 번째 피연산자와 두 번째 피연산자 평가 사이 : 논리 AND
&&
(6.5.13); 논리 OR||
(6.5.14); 쉼표,
(6.5.17).- 조건부의 첫 번째 피연산자 평가 사이
? :
연산자와 둘째 피연산자와 세 번째 피연산자 중 어느 것이 평가되는지 (6.5.15).- 완전한 선언자의 끝 : 선언자 (6.7.6);
- 전체 표현식의 평가와 평가할 다음 전체 표현식 사이. 다음은 완전한 표현식입니다 : 복합 리터럴 (6.7.9)의 일부가 아닌 이니셜 라이저; 표현식 (6.8.3)에서의 표현; 선택 문의 제어 표현 (
if
또는switch
) (6.8.4);while
문 또는do
문의 제어 표현 (6.8.5);for
문 (6.8.5.3)의 각 (선택적인) 표현;return
문 (6.8.6.4)의 (선택적) 표현식.- 라이브러리 함수가 반환되기 직전에 (7.1.4).
- 형식화 된 입출력 함수 변환 지정자 (7.21.6, 7.29.2)와 연관된 조치 후.
- 비교 함수에 대한 각 호출 직전과 직후, 그리고 비교 함수 호출과 해당 호출에 대한 인수로 전달 된 객체 이동 (7.22.5) 사이.
시퀀스 식
다음 표현식이 순서대로 나열됩니다 .
a && b
a || b
a , b
a ? b : c
for ( a ; b ; c ) { ... }
모든 경우에, 표현식 a
는 완전히 평가되고 b
또는 c
가 평가되기 전에 모든 부작용이 적용 됩니다. 네 번째 경우에는 b
또는 c
중 하나만 평가됩니다. 마지막 경우에는 b
가 완전히 평가되고 c
가 평가되기 전에 모든 부작용이 적용됩니다.
모든 경우에있어서, 식의 평가 a
의 평가 전에 서열화 b
또는 c
(또는, 평가의 b
및 c
평가 후에 서열화된다 ). a
따라서 다음과 같은 식은
x++ && x++
x++ ? x++ : y++
(x = f()) && x != 0
for ( x = 0; x < 10; x++ ) { ... }
y = (x++, x++);
잘 정의 된 행동을 취한다.
순서없는 표현
다음 표현식은 순서가 지정 되지 않습니다 .
a + b;
a - b;
a * b;
a / b;
a % b;
a & b;
a | b;
상기 예에서, 식 a
이전에 평가 될 수 있거나, 발현 후 b
, b
이전에 평가 될 수있다 하거나 여러 명령어에 해당하는 경우 심지어 혼합 될 수있다. a
함수 호출에도 비슷한 규칙이 적용됩니다.
f(a, b);
여기뿐만 및 a
b
(인터넷 익스플로러 unsequenced되어 ,
함수 호출의 오퍼레이터가 연속 점을 생성하지 않음)뿐만 아니라, f
호출 될 함수를 결정하는 식.
부작용은 평가 직후에 적용되거나 나중 시점까지 연기 될 수 있습니다.
같은 표현
x++ & x++;
f(x++, x++); /* the ',' in a function call is *not* the same as the comma operator */
x++ * x++;
a[i] = i++;
또는
x++ & x;
f(x++, x);
x++ * x;
a[i++] = i;
정의되지 않은 동작을 발생 시킵니다.
- 객체의 변경 및 객체에 대한 다른 액세스의 순서가 지정되어야합니다
- 부작용 1 이 적용되는 평가 순서 및 순서는 지정되지 않습니다.
1 실행 환경의 상태가 변경되었습니다.
불확실한 시퀀스 식
f(a)
와 같은 함수 호출은 항상 인수와 지정자 (여기에서 f
와 a
)의 평가와 실제 호출 사이의 시퀀스 포인트를 의미합니다. 이러한 두 개의 호출이 순서가 지정되지 않은 경우 두 함수 호출은 불확실한 순서로 배열됩니다. 즉, 하나가 다른 호출보다 먼저 실행되고 순서가 지정되지 않습니다.
unsigned counter = 0;
unsingned account(void) {
return counter++;
}
int main(void) {
printf("the order is %u %u\n", account(), account());
}
printf
인수를 평가하는 동안 counter
암시 적으로 두 번 수정하면 유효하며 어떤 호출이 먼저 발생하는지 알 수 없습니다. 주문이 명시되지 않았기 때문에 달라질 수 있으며 의존 할 수 없습니다. 그래서 출력물은 다음과 같습니다 :
순서는 0 1
또는
순서는 1 0이다.
중간 함수 호출없이 위와 유사한 문
printf("the order is %u %u\n", counter++, counter++); // undefined behavior
counter
의 두 수정간에 순서 지점이 없기 때문에 정의되지 않은 동작이 있습니다.