2017-09-07 17 views
1

lvalue 및 rvalue를 학습합니다. 정의는 "주소"가 될 수있는 것이 무엇이든간에 왼쪽 값이고 그렇지 않으면 rvalue입니다.lvalue 및 rvalue 전/후 단위 증분

연산자 우선 순위를 확인한 결과 접두사와 접미사 증가 모두가 "주소"연산자보다 우선합니다.

다음 두 예제의 경우 첫 번째 "& ++ value1"은 좌변표이고 두 번째 것은 "& value1 ++"가 rvalue 인 이유를 누구든지 설명 할 수 있습니까?

두 경우에 대한 이해가 잘못되었습니다. pValue1이 value1 변수를 가리키고 있습니다. 아무리의 값 1은 이전 또는 주소의 상관 관계가 구축되면, 값 1 변수는 항상 하나 개의 메모리 위치를 차지하고 우리가 바로 그 주소를 도출 할 수 후 8로 변경되지 않습니다?

int value1=7; 

int *pValue1=&++value1; 

int *pValue1 = &value1++; 
+2

접미사'연산자 ++의'preincremented 복사,하지 증가 개체에 직접 관련되지 – Fureeish

+0

에 대한 참조를 반환하지만 '좌변'당신의 정의가 완전하지 않습니다. bitfields은 lvalues지만, 당신은 그들의 주소를 얻을 수 없습니다. – HolyBlackCat

답변

2

내 의견에 따라 컴파일러가 이러한 종류의 조작에 반대하는 이유를 알 수 있습니다. 문제는 객체 (이 경우 int)가, 원래의 값을 증가하고 preincremented 복사본을 반환 복사 후위 operator ++의 일반적인 구현에있다. 당신은 다음과 같은 방식으로 정의되는 함수의처럼 생각할 수 있습니다 : 당신이 당신의 예에서 그 기능을 사용하려고하면, 컴파일러는 또한에 항의합니다

int foo_operator(int& a) 
{ 
    int copy = a; 
    a += 1; 
    return copy; 
} 

. 해당 함수의 반환 값은 의 값인입니다.

이제 요청할 수도 있습니다 - 접두사 operator ++와 무슨 일이야? 또한 값을 반환하는 함수가 아닌가? 대답은 아니요입니다. 참조 아닌 복사 된 값을 반환 operator ++ 접두어, 그 때문에 '결과는'피연산자 & 사용할 수 있습니다.