在學c++過程中,左值與右值的概念是一道繞不過去的坎,因此就想寫一些自己的理解。
左值(lvalue)與右值(rvalue)是c++語法中的術語(terms),第一次看到這兩個詞的時候,很自然就認為在乙個表示式中,在等號左邊的就是左值,在等號右邊的就是右值。如果你們第一次看到這兩個詞也這麼認為的話,那我要恭喜你們,說明你們離理解左值與右值的概念僅一步之遙了。也許有人會說這純粹是調侃,其實不然,等我把前面說的話稍微昇華一下,你就會發現其實也不無道理。
前面說我第一次理解左值右值的時候,我提到了幾個關鍵的詞,分別是「表示式」,「等號」,「左邊」,「右邊」。你也許會很困惑我為什麼要強調這幾個詞,其實在說左右值的時候,我們已經很自然的給它新增了一些限制。
首先,「表示式」就是左值與右值出現的地點,也就是說,無論我們何時談到左值和右值,都必須與表示式聯絡起來。只有在表示式中,左右值才能體現它該有的屬性意義。
其次,等號可以很自然讓我們區分什麼是左,什麼是右。當然左值與右值的概念不可能僅僅只是靠等號的左右去區分的。但我們可以想想,等號左邊是用來幹嘛的?等號右邊是用來幹嘛的?聰明的你肯定會回答,等號左邊是用來儲存右邊的值,等號右邊是用來把值給左邊的,即左邊是用來被賦值的,右邊用來賦值的。當想明白這點之後我們就可以假設,左值就是用來被賦值的,右值是用來賦值的。可是很快你就發現,如果這樣想的話那豈不就乙個值即可當左值,又可當右值?當我們將其放在左邊,他就是左值,放在右邊,即是右值,這豈不自相矛盾?要是沒等號,我們要怎麼區分左右值?的確是這樣,所以我們回顧下我們目前為止所理解的左右值概念就會發現,對於「左值就是用來被賦值的」可以換成「能被賦值的就是左值」這樣去描述,而「右值是用來賦值的」可以換成「不能被賦值的就是右值」這樣去描述,這樣我們就可以發現一切都說通了。而且左值與右值恰恰就是表示這樣的意思。所以在c++中,你可以認為,變數都是左值,因為它們都可以被賦值。而對於不可賦值的字面值(literal value),臨時變數等,他們就是右值,因為我們無法給它們賦值。
你是不是以為現在一切都結束了,其實還沒完。如果再細細地去思考的話,就可以用一種更抽象的描述:能被取位址的值就是左值,不能被取位址的值即是右值。因為位址可以表示記憶體中一塊空間的位置,有位址當然就說明在記憶體中有這塊空間,這空間不僅可以儲存當前值,還可以儲存別的值,也即能被賦值。而不能被取位址說明在記憶體中沒有這塊空間,即無法給它賦值。
C 左值與右值
左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,不少寫了很久c c 的人甚至沒有聽過這個名字,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在...
C 左值與右值
乙個很常見的誤區就是左值時等號左邊的值,右值時等號右邊的值 含義 左值是指表示式結束後依然存在的持久化物件 右值是指表示式結束時就不再存在的臨時物件 左值是儲存單元內的值,即是有實際儲存位址的 右值則不是儲存單元內的值,比如它可能是暫存器內的值也可能是立即數。下圖取自乙個知乎的回答 看幾個例子 in...
C 左值與右值
左值 lvalue 是有識別符號 可以取位址的表示式,最常見的情況有 變數 函式或資料成員的名字返回左值引用的表示式,如 x x 1 cout 字串字面量如 hello world 在函式呼叫時,左值可以繫結到左值引用的引數,如 t 乙個常量只能繫結到常左值引用,如 const t 反之,純右值 p...