2012-01-25 2 views
0

누구나 다음의 출력을 설명 할 수 있습니까? 나는 모든 것을 논리적으로 만들려고했는데 나중에 'x'가 표현식의 값으로 지정되었지만 printf 문에서 그 대답이 어떻게 다른지 이해할 수없는 후기 부분을 설명 할 수 있습니다 !!!printf의 단항 연산자

다른 컴파일러는 다르게 동작 할 수 있습니다. 누군가가 어떤 컴파일러에 대해서이 동작을 설명 할 수 있다면 좋을 것입니다. 내가 GCC를 사용하고

오픈 수세 12.1 (아스파라거스) (i586 버전)에 (SUSE 리눅스) 4.6.2

코드 :

#include<stdio.h> 

int main() 
{ 
unsigned int x=0; 
printf("expr= %d x=%d\n",(x^x),x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",(x^x)||x++,x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",(x^x)||x++||++x,x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",x++,x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",++x||x++,x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",x++||++x||x++,x); 
printf("x=%d\n",x); 
x=0; 
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x); 
printf("x=%d\n",x); 
x=0; 
(x^=x); 
printf("x=%d\n",x); 
x=0; 
(x^=x)||x++; 
printf("x=%d\n",x); 
x=0; 
(x^=x)||x++||++x; 
printf("x=%d\n",x); 
x=0; 
(x^=x)||x++||++x||x++; 
printf("x=%d\n",x); 

return 0; 
} 

출력 :

expr= 0 x=0 
x=0 
expr= 0 x=1 
x=1 
expr= 1 x=2 
x=2 
expr= 1 x=2 
x=2 
expr= 0 x=1 
x=1 
expr= 1 x=1 
x=1 
expr= 1 x=2 
x=2 
expr= 1 x=2 
x=2 
x=0 
x=1 
x=2 
x=2 

감사

+1

많은 코드가 있습니다. ** 당신이 이해하지 못하는 ** **을 지정하십시오 (당신이 이해하는 모든 것을 제거하는 것이 더 좋습니다). –

+1

시퀀스 포인트간에 변수를 증가시키고 게시하기를 원하는 사람들의 전단 숫자에 계속해서 놀랐습니다 ... 왜? –

+1

@EdS .:'||'는 시퀀스 포인트입니다. –

답변

4

지정되지 않은 동작을 호출하고 있습니다.

func(a,b)과 같은 표현식에서 C 표준은 어느 인수가 먼저 평가되어야 하는지를 지정하지 않습니다. 컴파일러는 자유롭게 할 수 있습니다.

이제 고려해보십시오 func(x++,x); 이 등가인지 불특정이다

a = x++; 
b = x; 
func(a,b); 

하거나 :

b = x; 
a = x++; 
func(a,b); 
+0

그 이유는 각 printf ("expr = % d x = % d", 'expr', x) 다음에 printf ("% d \ n", x)를 사용하는 이유입니다. 출력이 일관된 것 같습니다. – ntalli

3
printf("expr= %d x=%d\n",(x^x)||x++||++x,x); 

이 기능없는 동작을 도시한다. (x^x)||x++||++xx 사이의 평가 순서는 지정되지 않았습니다.

프로그램에서 다른 printf 호출의 대부분은 동일한 문제가 있습니다.

(C99, 6.5.2.2) "함수 부호의 평가 순서는 실제 인수 내의 실제 인수 및 표현식은 불특정이지만, 실제 통화 전에 시퀀스 포인트 가있다."

출력이 지정되지 않은 동작에 의존하는 프로그램은 엄격하게 준수하는 프로그램이 아닙니다 (C99, 4.p5 참조).

+0

IThat은 각 printf ("expr = % d x = % d", 'expr', x) 다음에 동일한 것을 확인하기 위해 printf ("% d \ n", x)를 사용하는 이유이기도합니다. 출력이 일관된 것 같습니다. – ntalli

+1

@ user1170267 출력은 컴파일러와 일치 할 수 있지만 지정되지 않은 동작이므로 동일한 컴파일러의 다른 버전과 다를 수 있으며 동일한 컴파일러를 사용하지만 다른 요일에도 다를 수 있습니다. – ouah

+0

나는 printf ("expr = % d \ n", (x^x) || x ++ || ++ x || x ++) .....와 (x^= x) | | x ++ || ++ x || x ++). – ntalli