C lvalue(左值)和rvalue(右值)

2022-07-20 17:33:16 字數 1183 閱讀 6893

昨天寫**遇見乙個這樣的錯誤:;

};int main()簡單定義:記憶體中有確定儲存位址的物件的表示式的值,可以是乙個變數名:int a;,可以是乙個賦值表示式a=b,或者字串常量"cnblogs",總之,最簡單鑑別的方法就是編譯以下這個句子&(需要鑑別的表示式),能通過編譯就是左值。

嚴格定義見:c++文件

可以被取位址(&),上邊我們就是用這個方法來鑑別左值。

可以被賦值,或者複製賦值;

//賦值

int a = 10;

//複製賦值

int a(10);

可以初始化左值引用,也就是我們常用的引用;

int a=10;

int& reference = a;

這是一些常用的性質,更多性質見:c++文件

:非左值。

常見的有字面值(除了字串常量),後置自增自減表示式a++;a--;

不能被取位址

int a = 1;

int* p = &(a++); //報錯,a++是右值,不能被取位址,而++a是左值

不能被賦值或者複製賦值

42 = 10;//很明顯會報錯

可以初始化const左值引用 ,這就是我開頭程式報錯的原因!我的程式沒有const

class myclass ;  //這裡的形參引用用const修飾就可以編譯通過了!!!

};int main()

可以初始化右值引用;因為右值引用已經超出我的知識範疇了,以後學到再來補充。

note:下邊的引用都是說左值引用

那為什麼加上const就可以了呢?

這是因為將const引用繫結到右值時,編譯器採取了一種妥協機制:編譯器會為臨時資料建立乙個新的、無名的臨時變數,並將臨時資料放入該臨時變數中,然後再將引用繫結到該臨時變數。注意,臨時變數也是變數,所有的變數都會被分配記憶體。所以說const引用實際上是和右值的乙個copy繫結了。

參考:

左值和右值,左值引用和右值引用

左值 lvalue 這一術語 於c語言,用來指代那些可以用在賦值表示式左側的東西,具名物件 在棧和堆上分配的物件,或者其他物件的成員,總之就是又確定儲存空間的東西。而術語右值 rvalue 也是源自c語言,指的是只能在賦值表示式右側出現的東西,如字面值和臨時物件。只能繫結到左值,不能繫結到右值的引用...

左值和右值

c c 語言中可以放在賦值符號左邊的變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。或者說左值是代表乙個記憶體位址值,並且通過這個記憶體位址,就可以對記憶體進行讀並且寫 主要是能寫 操作 這也就是為什麼左值可以被賦值的原因了。相對應的還有右值 當乙個符號或者常量放在操作...

左值和右值

參考 左值就是在賦值中可以放在賦值操作符兩邊的值,比如 int a 1 double b 2.0 a b b a 這裡a和b都是左值,一切變數都是左值,但const量是例外。而右值則是只可以放在賦值操作符右邊的值,比如 int a 0 char b hello 3 a error howdy b e...