繁体   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