2012-01-19 2 views
2

나는 아직 초보자이므로 나를 쉽게 쏘지 마라.전/후 증가 설명

나는 완전히 혼란 스러워요과 할 수없는 삶의 그림 밖으로에 대한 이유는이 코드를 실행하면 대신 이러한 결과

y = 9 
++y = 9 
--y = 9 
y++ = 8 
y-- = 9 
y = 9 

: 나는 다음과 같은 결과를 얻을 수

int y = 9; 
cout << "++y = " << ++y << "\n--y = " << --y << "\ny++ = " << y++ << "\ny-- = " << y-- << "\n"; 
cout << "y = " << y << "\n"; 

를 : 이 코드에서 얻을

y = 9 
++y = 10 
--y = 9 
y++ = 9 
y-- = 10 
y = 9 

:

,
int y = 9; 
cout << "y = " << y << "\n"; 
cout << "++y = " << ++y << "\n"; 
cout << "--y = " << --y << "\n"; 
cout << "y++ = " << y++ << "\n"; 
cout << "y-- = " << y-- << "\n"; 
cout << "y = " << y << "\n"; 

누구나 가능한 한 간단한 단어로 설명 할 수 있습니까? 첫 번째 코드에서 어떻게됩니까? 그렇게 결과를 인쇄합니까?

+1

, 심지어는 비 초보자가 그것을 주장하는 것이 너무 재미 있고 복잡한 문제이다. 좋은 질문에 감사드립니다. +1. – Gangnus

+0

실로! 나는 단지 최종 시험에서 유사한 질문을하고 그로 인해 점수를 잃고 싶지 않기 때문에 설명 할 명확하고 논리적 인 이유가 있기를 바랐다. : – XO39

+0

가능한 복제본 [누구나 이러한 정의되지 않은 동작을 설명 할 수 있습니까 (i = i ++ + ++ i, i = i ++, etc ...)] (http://stackoverflow.com/questions/949433/could-anyone-explain -these-undefined-behaviors-iiiii-etc) –

답변

11

주어진 규칙에서 동일한 위치를 두 번 이상 증가시키지 않아야한다는 간단한 규칙이 있습니다. 따라서 코드에는 y의 두 가지 증분이 포함되어야합니다 (int y; 선언으로 가정).

내용에 대한 시퀀스가 ​​C++ 표준정의되지 않은 동작 포인트 읽습니다.

많은 관련 질문이 있습니다. 그들에게 더 많은 것을보십시오!

+0

감사합니다, Basile. 우리 선생님이 시험에서 첫 번째 코드의 결과물을 줄 것을 요청 받았고, 내 대답은 두 번째 코드의 것과 동일했습니다. home 내가 그것을 시도하고 내가 완전히 틀렸다는 것을 알았 기 때문에 그 뒤에있는 논리를 이해하고 싶었다. * (int 선언 추가) * – XO39

+0

아니요 ** 오류 **입니다. +의 평가 순서를 예측할 수는 없습니다. +와 -하지만 a = 1; b = a ++ + a ++의 결과는 절대적으로 (ANSII) 예측 가능합니다 5 일입니다. – Gangnus

+1

다시 말하면 브라우저 오른쪽에 10 개 이상의 관련 질문이 있습니다. 그것들은! –

3

규칙 *에 따라 작업 *이 + 앞에오고 ++는 * 앞에 오면 * 될 것입니다.

a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c 

그러나 당신은 ++가있을 때 * 할까 .., 아무도 말할 수없는, 두 피연산자의 무엇을하는 ++ 나 할까 ..이 먼저 평가됩니다. ANSII 표준에 따르면 동일한 번역자를 사용하더라도 결과는 매번 예측할 수 없게됩니다.

는 C++ ANSII 표준에서 인용 :

명시된 경우를 제외

개별 연산자 개별 식 표현식의 피연산자의 평가 순서 및 부작용이 수행되는 순서 가 지정된다. 이전의 시퀀스 포인트와 스칼라 오브젝트 사이에 저장된 스칼라 객체는 표현식의 평가에 의해 한 번만 수정 된 값 을 가져야한다.온도계의 경우, 이전 값은 저장 될 값인 을 결정하기 위해서만 접근되어야한다. 이 단락의 요구 사항은 전체 표현식의 서브 표현식의 허용 가능한 순서 각각에 대해 을 충족해야합니다. 그렇지 않으면 동작이 정의되지 않습니다.[실시 예 :

 i = v[i++];  // the behavior is undefined 
     i = 7, i++, i++; // `i' becomes 9 

     i = ++i + 1;  // the behavior is undefined 
     i = i + 1;  // the value of 'i' is incremented 

시퀀스 점 : 전체 표현식 평가 끝에

  • (전체 표현은 어떤 큰 내의 표현식 아니다 식 문, 또는 임의의 다른 표현 표현);
  • ||, & &,? : 및 쉼표 연산자;
  • 및 함수 호출 (모든 인수를 평가 한 후 실제 호출 바로 전에 )에서 호출합니다.

그래서, || 시퀀스 포인트이지만 < <은 아닙니다. 첫 번째 코드의

+0

괄호로'a ++ * a -'를 합법적으로 만드는 것으로는 충분하지 않다고 생각합니다. '(a ++) * a -'등으로 코딩 된 경우에도 ** 정의되지 않은 동작 **입니다. 별도의 * 문에서 * 증가/감소 중 하나를 수행해야합니다. –

+0

예, 바로 여기 있습니다. 충분하지 않습니다. 더군다나 컴파일러가 우선권을 부여하는 것은 불가능합니다 ++ 또는 - – Gangnus

+0

예, "같은 레벨"의 단어가 잘못 선택되었습니다. 그들은 여기서 무감각하다. 죄송합니다. 제거되었습니다. – Gangnus

2

Mulitiline 버전이어야합니다 : 당신이 볼 수 있듯이

y = 9; 
    cout << "y-- = " << y-- << "\n"; 
    cout << "y++ = " << y++ << "\n" 
    cout << "--y = " << --y << "\n" 
    cout << "++y = " << ++y << "\n" 
    cout << "y = " << y << "\n"; 
+0

네, 아마'endl' 대신' "\ n"' –

+0

예, 알고 있습니다. 방금 첫 코드의 코드 값을 할당하는 방법과 두 코드의 * y *의 최종 값이 같은 동안 왜 그런 식으로 인쇄하는지 궁금합니다. – XO39

+1

값은 두 코드 조각에서 동일합니다. 첫 번째 코드와 두 번째 코드에서 동일한 연산을 사용하고 누적 값이 누적되기 때문입니다. – ldanko