c 中如何理解「左值」和 「右值」 左值是不是儲存在stack上,而右值是儲存在heap上?

時間 2021-06-04 10:48:26

1樓:AlseinX

從字面意思理解,左值和右值是指出現在賦值等號的左邊和右邊的值。右值只能出現在等號右邊,而左值只能出現在等號的左邊。

左值是指變數或具有變數語義的表示式,是記憶體空間中(無論是堆還是棧)分配出來的一段用於儲存值的空間。而右值是乙個具體的,可以被計算、被得出、被儲存的資料。

例如,有乙個int型別的變數a,它當前的值是1。

那麼這個時候a同時具有左值和右值的語義

當a用作右值時(可以暫且理解為出現在賦值等號右邊),它代表的是當前所儲存的值:1

所以此時int b = a;在結果上相當於int b = 1;

當a用作左值時(可以暫且理解為出現在賦值等號左邊),它所代表的是記憶體中的一段能夠儲存乙個int型別資料的空間:

a = 2; //用這個儲存空間去儲存2這個值,與它之前的值無關。

類似一張能寫字的紙,左值指這張紙本身,而右值指紙上寫的字。

a = b; 實際上是把b這張紙上寫的字(重點是要有字,寫在那張紙上的都不影響結果)抄在a這張紙上(重點是要有紙,紙上原來寫的什麼都不影響結果)。用「左值右值」來描述,也就是說這裡b作為右值語義,a作為左值語義

在實際的執行中,左值的本質是乙個記憶體空間中的位置,而右值是乙個在記憶體空間的某個位置儲存的值。故而,乙個左值可以被&取位址,可以被=賦值,而右值不能。

通常,具有左值語義的表示式也可以被用作右值,也就是取左值表示式所代表記憶體空間中的值來當作右值。而右值無法當作左值。

從操作符的角度講,&a是取得左值a本身代表的位址,作為指標型別的右值,而*a是取指標型別的右值a,當作代表其所指向記憶體空間的左值。

簡單舉例:

b = a + 1; //正確

a + 1 = b; //錯誤

因為「a + 1」這個表示式是右值語義,只代表了「將右值a和右值1相加得到的右值結果」,不代表任何記憶體空間,無法給它賦值。雖然左值b可以作為右值表示它當前儲存的值,但是右值a + 1無法作為左值。

2樓:ApsarasX

不是,左值右值跟儲存方式沒有關係

簡單點理解

左值是具名值,右值是匿名值

左值可以存在很長時間,右值一般臨時存在用於拷貝構造等號左邊的一般是左值,右邊的是右值(廢話)

3樓:d41d8c

理解成「激進的、容易接受新事物的值叫左值,保守的、代表固定現狀的值叫右值」也比你這靠譜啊。

比如說變數名a是左值,可以通過賦值使它接受新的數值。42是右值,它的數值是固定不變的。

當然以上都是扯淡。

左值和右值有沒有準確的定義?

c 把左值賦給左值和把右值賦給左值有什麼區別?

劉雲賓 後者會呼叫移動賦值運算子,前者只會呼叫普通複製運算子,即,後者 y 的值會改變,當然是在有移動賦值運算子的情況下 下面的程式,會測試兩者的不同 include include include int mainstd string y 123456 std string x x y std c...

左值和右值有沒有準確的定義

Byron 首先,在C 11中所有的值必屬於左值 右值兩者之一。在C 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值expiring value或純右值pure Rvalue 這裡的有名字是值得注意的,由於Move semantic perfect forwar...

關於C 左值和右值區別有沒有什麼簡單明瞭的規則可以一眼辨別?

caelum 其實吧,變數都是位址。變數裡面的資料還是存放在其它空間。如果儲存空間中的值有指標 變數 指向它,那麼這個變數就是乙個左值。如果這個空間的資料沒有變數指向它,那麼它就是乙個右值。大概是這樣吧。有沒特例我也不清楚。不過說實話,我也有點懵。比如 int a 10 如果反彙編的話,這個10是立...