c++左值和右值

C++ lvalues and rvalues

本文关键字:c++      更新时间:2023-10-16

好的,所以我一直在学习左值和右值-可以有人精通C/c++告诉我,如果我的想法是正确的吗?

考虑以下代码:

int i = 3;
int j = i;

这里我们有两个左值ij,当i赋值给j时,它成为隐式右值,因为i的副本存储在j中。但是,如果代码看起来像:

int i = 3;
int j = &i;

是否j&i都是左值,因为它们都是内存中的物理地址?我的理解是,右值是临时数据,而左值有一个物理的/可引用的内存地址。

对这一点的任何澄清将是伟大的!

变量i始终是左值。如果你可以对某个东西应用地址操作符(就像你在第二个例子中所做的那样),那么它就是一个左值。

同样在第二个示例中,&i是指向i指针,类型为int*。在j的声明和您想要初始化它的值之间存在类型不匹配。

最后,虽然i本身是左值,但表达式&i而不是左值,因为您不能对其应用寻址运算符(即您不能对&&i)。

这里我们有两个左值ij

i赋值给j时,它成为隐式右值,因为i的副本存储在j

不完全是,i仍然是左值,但它被转换为右值来读取它的值。这被称为左值到右值的转换。j仍然是左值

是否j&i都是左值,因为它们都是内存中的物理地址?

j是左值,但&i是右值;特别是int*类型的右值

作为左值右值是表达式的一个属性。一般来说,所有构成非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子表达式不是左值。

相关文章:
  • 没有找到相关文章