2010-11-19 3 views
0

가능한 중복 : 나는 두 경우에 출력 2 2 2를 가지고
FAQ : Undefined Behavior and Sequence Points예측할 수없는 출력

#include<iostream> 
#include<stdio.h> 
int main(){ 
    int myVal = 0; 
    printf("%d %d %d\n", ++myVal,myVal,++myVal); 
    myVal = 0 ; /*reset*/  
    std::cout<<++myVal<<" "<<myVal<<" "<<++myVal<<std::endl; 
    return 0; 
} 

. 어떻게 2 2 2 일 수 있을까요? 예상 한 2 1 1 또는 1 1 2

+7

oh no. 다시는. SO에서 '시퀀스 포인트'를 검색하면 답변을 얻을 수 있습니다 – Chubsdad

+6

[FAQ : 정의되지 않은 동작 및 시퀀스 포인트] (http://stackoverflow.com/questions/4176328/faq-undefined-behavior-and-sequence-points)의 중복) – Naveen

+0

@ Naveen : 고마워요. 요즘 나는 시퀀스 '시퀀스 포인트'를 보길 좋아하지 않습니다. – Chubsdad

답변

0

사전 증가 연산자는 실제로 컴파일되어 printf 및 cout을 호출하는 표현식이 평가되기 전에 모든 사전 호출이 실행됩니다.

그것은 당신이 한 것처럼입니다 :

int myVal = 0; 
myVal += 1; 
myVal += 1; 
printf("%d %d %d\n", myVal, myVal, myVal); 

그것은 또한 컴파일러 최적화가 상수를 사용하는만큼 멀리 갈 수 있습니다 상상할 수 '2'대신이 경우 런타임에 incrementations을 수행하는 값.

편집 : diclaimer :이 답변은 특히 OP 코드의 경우에 일어난 일을 설명하기위한 시도이지만 실제로 컴파일러는이 상황에서 원하는대로 할 수 있기 때문에 실제로 정의되지 않은 동작의 예입니다.

+1

downvote가 아닌 모든 대답 이 질문에 정말로 "undefined behavio"라는 단어가 있어야합니다. 아르 자형"! –

관련 문제