簡體   English   中英

C ++左值和右值

[英]C++ lvalues and rvalues

好吧,所以我一直在學習左撇子和左撇子 - 有沒有精通C / C ++的人告訴我,我的想法是否正確?

考慮一下代碼:

int i = 3;
int j = i;

這里我們有兩個左值ij ,當i被賦值給j它變成一個隱式右值因為i的副本存儲在j 但是,如果代碼看起來像:

int i = 3;
int j = &i;

j&i都是左值,因為它們都是內存中的物理地址嗎? 我理解它的方式是rvalues是臨時數據,而lvalues有一個物理/可引用的內存地址。

對此的任何澄清都會很棒!

變量i永遠不會成為左值。 如果你可以將address-of運算符應用於某些東西(就像你在第二個例子中所做的那樣),那么它就是一個左值。

此外,在第二實施例&i是一個指向 i ,並具有類型int* j的聲明和要初始化它的值之間存在類型不匹配。

最后,雖然i本身是一個左值,但是表達式&i 不是左值,因為你不能將address-of運算符應用於它(即你不能做&&i )。

作為左值 是表達式的屬性。 通常,構成非const限定標識符的所有表達式都是可修改的左值

int i = 5;
i; // the expression "i" is an lvalue and is modifiable

const int j = 3;
j; // the expression "j" is still an lvalue, but not modifiable

可以通過任何賦值, ++--運算符修改左值表達式(除非使用const限定)。 您還可以在此類表達式上應用& “address-of”運算符。

有些運算符比如一元* ,數組下標運算符[]. ->運算符也產生左值。 這意味着您可以說,例如, *p = 3 ,或a[i] = 5 ,或b.c++&c->d

另一方面,不是左值的表達式是右值(它們是臨時的並且不能被修改)。 如果您編寫類似3 = 57++ ,編譯器會抱怨37子表達式不是左值。

這里我們有兩個左手ij

是的

i被分配給j它變成隱含的右值,因為i的副本存儲在j

不是真的, i仍然是左值,但它被轉換為右值來讀取它的值。 這稱為左值到右值的轉換。 j仍然是左值。

j&i都是左值,因為它們都是內存中的物理地址嗎?

j是左值,但是&i是右值; 特別是int*類型的prvalue。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM