C 中的左值和右值

2021-09-11 21:38:33 字數 1907 閱讀 9546

學c++時間也不短了,突然發現,還不知道左值和右值是什麼,畢竟學c++不夠系統,詳細。

摘自《c++ primer》第五版

c語言中,左值可以位於賦值語句的右側,右值則不能。

c++中,乙個物件被用作右值時,用的是物件的值(內容);當物件被當做左值的時候,用的是物件的身份(在記憶體中的位置)。     乙個左值表示式的求值結果是乙個物件或者乙個函式。當然,以常量物件為代表的某些左值實際上不能作為賦值語句的左側運算物件(本人理解:功能不全的左值;除了自己的初始化,一般不用作左值使用。)

左值和右值轉換的乙個重要原則:在需要右值的地方可以使用左值來替代,但是不能在需要左值(位置)的地方,使用右值。當然,也有一種例外的情況(參見p470,還沒看到)。

p149:左值是指那些求值結果為物件或函式的表示式。乙個表示物件的非常量左值可以作為賦值

關於運算子運算元和返回值的左右值

**博主: nwpu061701

左值(lvalue)和右值(rvalue)是 c/c++ 中乙個比較晦澀基礎的概念,不少寫了很久c/c++的人甚至沒有聽過這個名字,但這個概念到了 c++11 後卻變得十分重要,它們是理解 move/forward 等新語義的基礎。

左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號右邊的變數(或表示式),右值指的則是只能出現在等號右邊的變數(或表示式).

int a;

int b;

a = 3;

b = 4;

a = b;

b = a;

// 以下寫法不合法。

= a;

a+b = 4;

在 c 語言中,通常來說有名字的變數就是左值(如上面例子中的 a, b),而由運算操作(加減乘除,函式呼叫返回值等)所產生的中間結果(沒有名字)就是右值,如上的 3 + 4, a + b 等。我們暫且可以認為:左值就是在程式中能夠尋值的東西,右值就是沒法取到它的位址的東西(不完全準確),但如上概念到了 c++ 中,就變得稍有不同。具體來說,在 c++ 中,每乙個表示式都會產生乙個左值,或者右值,相應的,該表示式也就被稱作「左值表示式", "右值表示式"。對於基本資料型別來說(primitive types),左值右值的概念和 c 沒有太多不同,不同的地方在於自定義的型別,而且這種不同比較容易讓人混淆:

1) 對於基礎型別,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修飾(cv-qualitification ignored)

2) 對於自定義的型別(user-defined types),右值卻允許通過它的成員函式進行修改。

對於 1),這和 c 是一致的,2) 卻是 c++ 中所獨有, 因此,如果你看到 c++ 中如下的寫法,千萬不要驚訝:

class cs

~cs()

cs& operator=(const cs& other)

int get_i() const

void change(int i)

private:

int i_;

};cs get_cs()

int main()

這個特性看起來多少有些奇怪,因為通常來說,自定義型別應該設計得和內建型別盡量一樣(所謂 value type,value semantic),但允許成員函式改變右值這個特性卻有意無意使得自定義型別特殊化了。對此,我們其實可以這樣想,也許會好理解點:自定義型別允許有成員函式,而通過右值呼叫成員函式是被允許的,但成員函式有可能不是 const 型別,因此通過呼叫右值的成員函式,也就可能會修改了該右值,done!

另附     simonkly

C 中的左值和右值

1.概念變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的 對於每個變數,都有2個值與其相關聯 1 資料值,儲存在某個記憶體位址中,也稱右值 rvalue 右值是被讀取的值 read value 文字常量和變數都可被用於右值。2 位址值,即儲存資料值的那塊記憶體位址,也稱左值 lva...

c 中的左值和右值

左值 lvalue 右值 rvalue 是 c c 中乙個比較晦澀的概念,有的人可能甚至沒有聽過,但這個概念到了 c 11 後卻變得十分重要,它們是理解move forward 等新語義的基礎。左值與右值這兩概念是從c中傳承而來的,在c中,左值指的是能夠出現在等號左邊及右邊的變數 表示式 右值則指的...

C 中的左值和右值

左值 lvalue 應該被解釋被location value,即可被定址的值 右值 rvalue 應該被解釋為read value,即唯讀的值,而不能被定址 這樣理解應該更為準確一點 通俗的講,左值就是能夠出現在賦值符號左面的東西,而右值就是那些可以出現在賦值符號右面的東西了。舉個很簡單的例子 a ...