2010-12-06 4 views
0
void call(int x,int y,int z) 
{ 
    printf("%d %d %d",x,y,z); 
} 
int main() 
{ 
    int a=10; 
    call(a,a++,++a); 
    return 0; 
} 

이 프로그램은 다른 컴파일러에서 다른 출력을 제공하며, Linux에서 컴파일했을 때 m/c 출력이 매우 이상합니다.는 출력을 예측합니다

답변

3

동작이 정의되지 않았기 때문에. 컴파일러는 call()에 전달하기 전에 임의의 순서로 a, a++++a을 평가할 수 있습니다. (기술적으로는 정의되지 않은 동작을 호출했기 때문에 실제로는 아무 것도 할 필요가 없으며 원하는 코드를 작성할 수 있습니다.) 평가 순서에 따라 결과가 다릅니다.

+0

하지만 값이 함수에 전달 될 때 평가 순서는 스택에서 이루어 지므로 순서가 있어야합니다 .. –

+1

예, 순서는 컴파일러마다 다를 수 있지만 Karl의 말처럼 동작은 정의되지 않습니다. 충돌을 포함하여 무엇이든 할 수 있습니다. –

+0

@ user531802 그건 부적당합니다. 컴파일러는 컴파일러 작성자의 작업을 쉽게하고 최적화 기회를 늘리기 위해 C 언어 표준에서 이러한 세 가지 인수를 임의의 순서로 평가할 수 있습니다. –