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

時間 2021-06-03 07:26:22

1樓:Byron

首先,在C++11中所有的值必屬於左值、右值兩者之一。

在C++11中可以取位址的、有名字的就是左值,反之,不能取位址的、沒有名字的就是右值(將亡值expiring value或純右值pure Rvalue),這裡的有名字是值得注意的,由於Move semantic & perfect forward

在C語言中,左值指的是既能夠出現在等號左邊也能出現在等號右邊的變數(或表示式),右值指的則是只能出現在等號右邊的變數(或表示式)。

inta=5

;//a為左值,5為右值

intb=a

+1;//b 為左值,a+1為右值

intc=a

+b;//nc為左值,a+b 為右值a+

b=100;

//error:a + b不滿足左值的定義(a+b)=

100;

//error:(a

+1)=

100;

//error:

return

something

;//純右值

return10;

//純右值

在C++11中左值引用就是對乙個左值進行引用的型別。右值引用就是對乙個右值進行引用的型別。由於右值通常不具有名字,也不能獲取其位址,只能通過引用的方式找到它的存在。

而右值引用的目的是延長expiring value的生命期,或者說供左值這種江洋大盜「偷取」其資源來使用。

2樓:自學生

用我發現了《時間生命是一對同在的自然法則》觀點來看,核心時間的個人,=是自然規律的六份統一半徑時間週期,=是六份正方面同在的一對正反標準立方體,=是前中後時間生命,上中下浮力重力物質,左右明暗的速度力量。1份六份之一半徑時間週期,=是半徑5*5*2=50的變形正方面標準時間模型。所以,前後左右上下,都是一對同在的自然規律法則的原理模型。

3樓:丁仲堃

很明顯在通用程式語言裡,左值是乙個儲存了值的空間,或者叫資料單元,而右值指的是資料本身,二者的區別是左值是靜態的而右值是動態的。

4樓:開開心心學做人

有個通俗理解,左值是可以放在等號左邊的(即可以被賦值的),右值不可以放等號右邊

右值要麼是字面值,要麼是臨時變數

臨時變數示例

string& str = "hello"; //異常,我忘了怎麼報的了

「hello」是const char*型別,它會先生產乙個string型別的臨時變數,這時這個string就是右值,當然了,「hello」本身也是個右值

又比如int& i = a + 2;

上面右邊也會生產乙個臨時的int型別變數,也是右值

使用引用(左值引用),就可以很好地驗證這個數是左值還是右值了

補充一下,舊版本裡,右值也可以進行賦值的,比如i +4=3

但是,新標準中加入了引用限定符

我回答問題是為了加深自己的印象,更是希望自己的錯誤能被大家發現糾正一下,嘿嘿,利己主義

5樓:d41d8c

值類別 - cppreference.com 這裡對標準裡的規定做了整合。在標準裡,各種表示式的值類別(左值/右值)是在各自的章節分別定義的。

簡單地說,就是對每種表示式分別強行規定,如果它滿足什麼形式,它就是左值。

比如說對於簡單的名字,定義在[expr.prim.id.unqual]:

The expression is an lvalue if the entity is a function, variable, or data member and a prvalue otherwise

對於函式呼叫表示式,定義在[expr.call]/11:

A function call is an lvalue if the result type is an lvalue reference type or an rvalue reference to function type, an xvalue if the result type is an rvalue reference to object type, and a prvalue otherwise.

對於成員訪問表示式,定義在[expr.ref]/4(有點長,就不複製過來了)。

Clang的具體實現可以看 ExprClassification.cpp#L103-L426。

GCC的具體實現可以看 tree.c#L53-L332。

至於「左值可以放在賦值運算子左邊」「可以對左值取位址」「左值可以繫結到左值引用不能繫結到右值引用」,這些都是在定義之上的規定(而且是不完整的表述)。可以利用這些,通過把表示式塞給編譯器來粗略地【驗證】某個表示式是不是左值,但是它們都不是【定義】。

另外還有「指代物件或函式的都是(泛)左值」,這是由定義衍生的推論,也不是定義(雖然這或許也是定義背後的意圖)。

還是出個題吧。

考慮const int x = 0;

volatile int y = 0;

如果你是編譯器(也就是說不能用「塞給編譯器」的方法),如何判斷bool() ? x : y是左值還是右值。

(已知x和y都可以轉換到const volatile int&型別。)

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

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

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

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

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

AlseinX 從字面意思理解,左值和右值是指出現在賦值等號的左邊和右邊的值。右值只能出現在等號右邊,而左值只能出現在等號的左邊。左值是指變數或具有變數語義的表示式,是記憶體空間中 無論是堆還是棧 分配出來的一段用於儲存值的空間。而右值是乙個具體的,可以被計算 被得出 被儲存的資料。例如,有乙個in...