2014-04-14 2 views
-4
int x=10; 
printf("%d %d %d\n",x,++x,x++); 
printf("%d %d %d",x,x+20,x+30); 

인쇄 순서는

12 12 10 
12 32 42 

로 출력을 인쇄한다? 책에서 C가 역순으로 인쇄본을 사용하고 있습니다.

+1

또는 ... [정의되지 않은 동작 및 순서 포인트] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) 및 기타 여러 가능성이 있습니다. – WhozCraig

+0

평가하는 동안 먼저 오른쪽에서 시작하여 모든 값을 스택으로 가져옵니다. 변수에 포스트/프리 증분이 있으면 값을 평가하고 저장합니다. 그렇지 않으면 스택에 변수로 저장하고 var의 최종 값을 취합니다. 가장 많이 x ++ - 10인데 그 이유는 post inc가 x를 11로 업데이트하기 때문입니다. ++ i - 12, pre inc 및 x는 x가 스택에있는 것처럼 12로 업데이트됩니다. 최종 출력은 스택에서 검색하는 순서 인 12 12 10이됩니다. – Dinesh

답변

2

코드에 의 정의되지 않은 동작 ("UB")이 있습니다. 따라서 모든 일이 발생할 수 있습니다.

특히, 규칙 위반은 작성 값을 결정할 때를 제외하고는 시퀀스 포인트가없는 동일한 변수를 읽고 쓰지 않아야한다는 것입니다.

+0

주석 길이가 제한되어 있으므로 printf ("% d % d % d % d", i, ++ i, i ++, i); with i = 1 평가하는 동안, 우선 오른쪽에서 시작하여 모든 값을 스택으로 가져옵니다. 변수에 포스트/프리 증분이 있으면 값을 평가하고 저장합니다. 그렇지 않으면 스택에 변수로 저장하고 var의 최종 값을 취합니다. 오른쪽에있는 대부분의 i - i는 스택에, i ++ - 1의 포스트 인크루먼트는 i가 2로 업데이트 되었기 때문에 ++는 i - 3, pre inc는 스택에있는 것처럼 i를 3으로 업데이트합니다. for var for i는 i의 최종 값을 3으로 취합니다. 최종 출력은 3 3 1 3입니다. – Dinesh

+0

@Dinesh : 표준에서 따르지 않습니다 ... – Deduplicator

+0

printf는 위에서 지정한 규칙을 따릅니다. varibales가 변경되거나 변경되지 않은 경우에 대한 그런 엄격한 규칙은 없습니다. – Dinesh