C 中左值和右值是什麼以及存在的理解誤區

2021-10-03 05:54:03 字數 1871 閱讀 6525

左值(lvalue)和右值(rvalue)的通俗理解是在如下的等式中,右值(right-value)放在等號右邊,左值(left-value)放在等號左邊,這就是左值右值的初步定義。

int a = 1 + 1
但這種方式並不能解釋左值和右值的根本含義,並且並不是每乙個等式的左邊一定是左值,右邊一定是右值。其根本的定義和區別不在於能否被賦值,而在與其是否有確定的記憶體位址。

這裡首先要清楚,左值還是右值,針對的是c++中的表示式而言的,c++官方給出的表示式定義為:an operator with its operands, a literal, a variable name, etc.

左值(lvalue):location-value,表示可定址。是儲存在記憶體中,具有確切位址,並能取位址,進行訪問,修改等操作的表示式。嚴格來說,這裡定義的左值是plvalue,也就是pure純左值。

右值(rvalue):read-value,表示可讀不可定址。是儲存在記憶體中,或者暫存器中,不知道也無法獲得其確切位址,在得到計算表示式結果後就銷毀的臨時表示式。嚴格來說,這裡定義的右值是prvalue,也就是pure純右值。

右值引用(xvalue):expiring value,表示即將過期但還沒過期的值。與純右值和純左值不同,c++11新出了對右值的引用,取決於如何使用,這種引用既可能是右值,也可能是左值,需要單獨考慮。

常見誤區

左值不一定可以修改,常量就是不可修改的,但是它有確定的位址,所以仍然是左值。

int const a = 2;//a是左值,但是a不可以修改
左值右值和引用,非引用沒有關係,左值引用一定是左值,右值引用可能是左值可能是右值。

左值引用

右值引用

非引用是左值

總是顯式宣告為變數時

是右值×

作為臨時變數時

左值顯然可以轉換成右值,右值不能轉化為左值,但是可以在其銷毀前,作為引數轉化為左值。

//左值轉換為右值

int a = 1;//a是左值

int b = 2;//b是左值

int c = a + b; //這裡a和b從左值轉換為右值,然後將和(右值)賦值給左值c。

//通過右值獲得左值

int array[2] = ; //array是乙個左值

*(array + 1) = 3;//array+1在計算過程中由左值轉換為乙個臨時右值

//該右值被解引用,又從右值轉換為乙個左值。

左值引用一般不能用右值初始化,因為如果用右值初始化,相當於將左值繫結在了右值上,那右值就不會被銷毀,也就不是右值了(此時編譯器通常會提示非常量引用的初始值只能為左值)。但是常量引用顯然可以賦右值,因為常量引用不會改變引用的值。當然,右值引用是另一種可以賦右值的引用型別。

int &a = 1;//錯誤,1是右值,a是左值引用,無法直接初始化

int a = 1; //正確,a是左值不是左值引用,可以被賦值

int const a = 1;//正確,a是常量左值引用,可以鏈到右值上

int &&a = 1;//正確,這是c++11中的右值引用,a為左值。

函式的返回值一般是右值,但也可以是左值。

//返回右值的常規函式

int fun()

//返回左值的函式

int &fun(int &a)

//以上函式可以這麼用

fun(a) = 4;//因為fun返回左值,所以fun可以被賦值

//錯誤的返回左值案例

int &fun()

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 ...