2017-09-07 59 views
1

學習左值和右值。定義是什麼可以是「地址」是左值,否則,它是右值。前/後綴增量的左值和右值

我檢查了運算符優先級,前綴和後綴增量的優先級都高於「運算符的地址」。

對於以下兩個示例,任何人都可以解釋一下爲什麼第一個「& ++ value1」是一個左值,而第二個「& value1 ++」是右值。

我對這兩種情況的錯誤理解是:pValue1指向value1變量。在建立地址關聯之前或之後,無論value1變爲8,value1變量總是佔用一個內存位置,我們可以得到它的地址,對嗎?

int value1=7; 

int *pValue1=&++value1; 

int *pValue1 = &value1++; 
+2

postfix'operator ++'返回一個預增量副本,而不是對增量對象的引用 – Fureeish

+0

不直接相關,但是您的「左值」定義不完整。位域是左值,但你不能得到他們的地址。 – HolyBlackCat

回答

2

根據我的評論,你可以看到爲什麼編譯器會反對這種操作。問題在於postfix operator ++的一般實現,它複製對象(在這種情況下爲int),增加原始對象並返回預先加密的副本。你可以認爲它像在這樣定義的函數:

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

如果您嘗試使用該功能在你的榜樣,你的編譯器也將抗議它。該函數的返回值是右值

您現在可能會問 - 怎麼了前綴operator ++?那也不是一個返回值的函數嗎?答案將是 - 。前綴operator ++返回參考,而不是複製的值,因此它的'結果'可以與操作數&一起使用。