2013-08-29 2 views
7

이 또 다른 시퀀스 포인트 질문이지만, 비교적 간단 하나함수 호출의 시퀀스 포인트?

#include <stdio.h> 
void f(int p, int) { 
    printf("p: %d\n", p); 
} 

int g(int* p) { 
    *p = 42; 
    return 0; 
} 

int main() { 
    int p = 0; 
    f(p, g(&p)); 
    return 0; 
} 

이 정의되지 않은 동작인가? 또는 g(&p)에 대한 호출이 시퀀스 포인트 역할을합니까?

답변

9

아니요 이 정의되지 않은 동작을 호출하지 않습니다. 함수 인수가 평가되는 순서가 표준에서 지정되지 않았으므로 지정되지 않음입니다. 결과는 컴파일러에서 결정한 평가 순서에 따라 0 또는 42이 될 수 있습니다.

+6

또한 질문은'g (& p)'가 시퀀스 포인트 역할을하는지 묻습니다. 'g (& p)'의 평가에는 'g'의 평가와 '& p'의 평가 사이, '전체 표현''* p = 42;의 평가와 'return'에서'0'을 리턴합니다. 그러나 둘 다'g (& p)'의 평가와 관련하여 인수'p'의 평가를 명령하지 않습니다. –

+0

@EricPostpischil : 좋은 코멘트. :-) – Nawaz

4

우리는 함수 인수의 평가의 순서를 알 수 없기 때문에 프로그램의 동작은 draft C++ standard1.9프로그램 실행 제 3 항에서, 지정되지 않은 :의

어떤 다른 측면 및 운영 추상 기계는이 국제 표준 에 기술되지 않은 것으로 기술되어있다 (예를 들어, 함수에 대한 인수의 평가 순서). 가능한 경우이 국제 표준은 허용 가능한 동작 집합을 정의합니다. [...]

및 기능 부 5.2.2함수 호출 8 항로부터 입력되기 전에 주장의 모든 부작용은 서열화되어

[참고 : 후위의 평가 표현식과 인수 표현식은 서로 상대적으로 순서가 지정되지 않습니다. 인수 표현식 평가의 모든 부작용은 함수가 입력되기 전에 순서화됩니다. (1.9 참조). -end 참고] C 두 지점 부에서 C99 draft standard에 적용되는로서는

6.5.2.2함수 호출 제 10 :

함수 부호의 평가 순서 실제 인수 및 실제 인수 내의 하위 표현식은 지정되지 않지만 실제 호출 전에 시퀀스 포인트가 있습니다.

그래서 모두 CC++ 당신은 f(0,0) 또는 f(42,0) 중 하나를 끝낼 수 있습니다.