C 的左值和右值

2022-10-09 02:00:11 字數 1221 閱讀 3857

c++語言中的左值和右值是困擾我的知識點,今天將學習到的知識點整理一下,以理清概念。本文首先介紹了左值、右值的一般分類和概念,包括廣義左值,將亡值和純右值,然後介紹了我對左值和右值的理解:將左值理解成水桶,將右值理解成水,最後介紹了左值引用和對常量的左值引用。

這三種類別和左右值的關係圖:

三種類別和左右值的關係圖

可以看出,右值包含了純右值和將亡值。我把左值理解成水桶,右值理解成水。這樣我感覺比較好記憶和理解。比如:

int x; //x左值,理解成乙個水桶

x = 10; // 10是右值,理解成水

int *p = &x; // 可以對水桶取位址,找到放水桶的位址

&10; // 編譯錯誤,水沒有位置,不能取位址

int y = x; // 把x水桶裡的水複製乙份到y水桶。

又如:

int f()  

int main()

左值引用,就是在水桶上貼上了乙個標籤,這個標籤代表了水桶(其實變數名字也可以理解成水桶上的標籤)。

比如:

int a = 10;

int &b = a; //貼上標籤

注意到常量的左值引用可以繫結到字面值常量上,也就是說以下**是正確的:

const int & c = 10; //編譯正確,但是「10」是右值,理解成水,c是左值引用,理解成標籤。
但是如果把左值引用理解成在水桶上貼標籤的話,以上**就與這個理解產生衝突了。畢竟「標籤」不能貼到「水」上。

其實,編譯器會建立乙個隱藏的變數來讓引用c繫結到10上。比如:

const int & c = 10; 

//會被翻譯成這樣:

int __internal_unique_name = 10;

const int& c = __internal_unique_name;

也就是說,編譯器會建立乙個左值(理解成「水桶」)來儲存10(理解成「水」),然後再讓引用繫結到該左值上(理解成在水桶上貼標籤)。

本文介紹了對左值和右值的理解。如果有什麼錯誤,希望讀者可以批評指正!

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

c 對於左值和右值沒有標準定義,但是有乙個被廣泛認同的說法 可見立即數,函式返回的值等都是右值 而非匿名物件 包括變數 函式返回的引用,const物件等都是左值。從本質上理解,建立和銷毀由編譯器幕後控制,程式設計師只能確保在本行 有效的,就是右值 包括立即數 而使用者建立的,通過作用域規則可知其生存...

C 左值和右值

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

C 左值和右值

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