수색…


비고

국제 표준 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 (또는, 평가의 bc 평가 후에 서열화된다 ). a

따라서 다음과 같은 식은

x++ && x++
x++ ? x++ : y++ 
(x = f()) && x != 0
for ( x = 0; x < 10; x++ ) { ... }
y = (x++, x++);

잘 정의 된 행동을 취한다.

순서없는 표현

C11

다음 표현식은 순서가 지정 되지 않습니다 .

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) 와 같은 함수 호출은 항상 인수와 지정자 (여기에서 fa )의 평가와 실제 호출 사이의 시퀀스 포인트를 의미합니다. 이러한 두 개의 호출이 순서가 지정되지 않은 경우 두 함수 호출은 불확실한 순서로 배열됩니다. 즉, 하나가 다른 호출보다 먼저 실행되고 순서가 지정되지 않습니다.

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 의 두 수정간에 순서 지점이 없기 때문에 정의되지 않은 동작이 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow