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