C 中的左值和右值

2021-09-23 20:08:51 字數 1081 閱讀 6694

在c/c++中,左值(lvalue)和右值(rvalue)是用於規定表示式(expression)的性質。c++中表示式要不然是左值,要不然是右值。

這兩個概念在c語言中比較容易理解:左值能放在賦值語句的左邊,右值不能。但是當來到c++時,二者的理解就比較複雜了(ps:有物件真是麻煩)

賦值運算子需要乙個(非常量)左值作為其左側運算物件,最後得到的結果也是乙個左值。eg:

num1 = num2 =num3;
在這裡,等於運算子從右到左計算,所以num2和num1是左值,num2=num3得到的結果也是左值,但是在這個語句裡被當成右值使用了。

取位址符作用於乙個左值運算物件,返回乙個指向該運算物件的指標,這個指標是乙個右值。eg:

int a = 10; int *p = &a;
在這裡,p是乙個左值,&a的結果是右值,因為&a的結果是乙個位址(字面常量)。

內建解引用運算子、下標運算子、迭代器解引用運算子、string和vector的下標運算子的求值結果,都是左值。

內建型別和迭代器的遞增遞減運算子作用於左值運算物件所得的結果也是左值。

當函式的返回值是引用型別是,可以用作左值,當函式的返回值是其他型別時,不能用作左值。eg:

char &get_val(string &str, string::size_type ix )

int main()

在這裡,get_val函式的返回值是引用,可以用作左值。

關於decltype,decltype返回的是乙個型別不是乙個表示式。當decltype作用於表示式的時候,結果根據表示式的不同也有所不同。如果表示式的結果是乙個左值,這decltype作用於該表示式得到乙個引用型別。eg:

int a = 11;

int *p = &a;

decltpye(*p) b = a;

如果表示式的結果是乙個右值,則decltype作用於該表示式得到的是乙個指標型別。eg:

int a = 11;

int *p = &a;

decltype(&p) p2 = &p

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