2013-08-29 3 views
-1

는 우리가 생각하는 예상 값이 20, 될 것입니다, 문 b = a++ + a++에 대한 코드++ 오버로드 된 연산의 결과가 왜 제거되지 않은 값이 되는가?

#include<iostream.h> 
#include<conio.h> 
class A{ 
    private: 
     int i; 
    public: 
     A() 
     { 
     i=10; 
     } 
     A operator++(int) 
     { 
     A tmp=*this; 
     i +=1; 
     return tmp; 
     } 
     display() 
     { 
     cout<<i; 
     } 
}; 
int main() 
{ 
    A a,b; 
    b=a++ + a++; 
    cout<<endl<<b<<"\t"<<a; 
    return 0; 
} 

를 참조하지만, 위의 문장은

방법 (21)으로의 결과

친절하게 도와주세요.

+0

간단한 예를 제공해주십시오. 당신이 가진 것은 컴파일되지 않습니다. – jrok

+0

방금 ​​시도한 것이거나 실제 제품 코드에서 의미가 있습니까?제품 코드의 경우에는 이것을 사용하지 않기를 바랍니다. 읽기 쉽기 때문에. – RvdK

+7

사람들은 왜 그런 말도 안되는 문장을 아직도 이해하려고합니까? 그들 중 일부는 정의되지 않은 행동이 아니지만 여전히 : 읽기 쉽지 않으며 -이 경우처럼 직감이 대부분 잘못되었습니다. 멈춰! – stefan

답변

2

찰스 (Charles)가 A 객체를 호출 한 ++이 함수 호출이라고 지적했기 때문입니다. 따라서 i를 10에서 11로 증가시키고 10을 반환 한 다음 두 번째 호출에서 i를 11에서 12로 증가시키고 11을 반환합니다. 10과 11을 21로 추가합니다.

+0

두 연산자가 모두 같기 때문에 정의 된 것처럼 보였습니다 (++). – Tim

+4

하지만'++ '는 모두 함수 호출입니다. 쓰기는 별도의 함수 호출에서 별도의 명령문에서 발생하므로 이전 용어를 사용하기 위해 개입하는 "시퀀스 포인트"가 있습니다. 이것은 동작이 정의되지 않은 이유가 아닙니다. –

+0

찰스에 대한 설명 주셔서 감사합니다. – Tim

1

첫 번째 호출은 a을 11을 입력하고 10을 반환합니다. 두 번째 호출은 a을 12로 증분하고 11을 반환합니다. 21과 같은 소리가 정확합니다. 말했다

(++는 "첫 번째 전화가") 평가의 순서는 가 지정되지 않은 (감사 JD)를, 그래서 같은 표현에 두 번 사용하는 것은 일반적으로 좋은 생각이 아니다이다.

+0

첫 번째 호출은 정의되지 않습니다. 둘 중 하나 일 수 있습니다. 이것은 어쨌든 결과를 변경하지는 않습니다. –

+2

@GuilhermeBernal : Pedantry - not * undefined *, * unspecified *. –

+0

@GuilhermeBernal, 두 통화가 같은 경우 차이점은 무엇입니까? – cpp

3

cppreference에 따르면, 코드는 그것을 계산, 그래서 b = (a++) + (a++)
에 동일, 우리는이 :

또한
a = 10; 
tmp1 = a++;//tmp1 = 10, a = 11 
tmp2 = a++;//tmp2 = 11, a = 12 
b = tmp1 + tmp2 // 10 + 11 = 21 

는 항상 괄호를 사용해야하므로 b = a++ + a++; 같은 구조는, 매우 가난 읽을 것을 기억 복잡한 표현식에서 a++과 같은 증감을 사용하지 않는 것이 좋습니다. 가독성은 운영자 우선 순위를 알고 있음을 보여주는 것보다 훨씬 낫습니다.

0

나는 간단한 비교의 형태로 대답을 표현할 것이다.

귀하의 코드는 다음과 같습니다

b = a + (a++)++; 
0

오버로드 연산자 재미있는 이름을 가진 단지 기능은 다음과 같습니다

b = a++ + a++; 

당신이 그것을 오히려 혼란으로 생각합니다. 그들은 내장 된 것과 똑같이 행동하지 않아도됩니다. 기본 제공 유형의 객체를 사용하여 동일한 표현식을 사용하도록 유혹 된 경우 -하지 마십시오. 동작은 정의되지 않습니다.

A에 대해 operator+의 정의를 표시하지 않았습니다. 무료 함수라고 가정합니다. 표현 b = a++ + a++;는 것을 명확하게하는 데 도움이

b = operator+(a.operator++(0), a.operator++(0)); 

희망으로 다시 작성할 수 있습니다.

후위 증가분에 대한 두 건의 호출은 불확실하게 순서가 지정됩니다. 즉, 어느 것이 먼저 호출 될지 알 수 없음을 의미합니다. 두 프로그램 모두 같은 객체에서 호출되기 때문에 문제가되지 않지만 특정 순서에 의존하지 않습니다. 동일한 프로그램 실행 중에도 일관성이있을 필요는 없습니다.

관련 문제