lvalue和rvalue对于前/后缀递增操作是什么意思?

7
学习左值和右值。定义是可以“寻址”的任何内容都是左值,否则就是右值。
我检查了运算符优先级,前缀和后缀递增的优先级都比“取地址”运算符高。
对于以下两个例子,有人能解释一下为什么第一个"&++value1"是左值而第二个"&value1++"是右值吗?
我对这两种情况的错误理解是:pValue1指向value1变量。无论value1在建立地址相关性之前还是之后被更改为8,value1变量始终占用一个内存位置,我们可以推导出它的地址,对吗?
int value1=7;

int *pValue1=&++value1;

int *pValue1 = &value1++;

2
后缀 operator++ 返回一个预增副本,而不是被增加对象的引用。 - Fureeish
1
不是直接相关的,但是你对“lvalue”的定义不完整。位域是lvalue,但你无法获取它们的地址。 - HolyBlackCat
1个回答

11

根据我的评论,您可以看出编译器为什么反对这种操作。问题在于后缀 operator ++ 的一般实现方式,它会复制对象(在本例中是int),增加原来的对象并返回那个预增加的副本。您可以将其视为以下方式定义的函数:

int foo_operator(int& a)
{
    int copy = a;
    a += 1;
    return copy;
}
如果你在你的例子中尝试使用那个函数,你的编译器也会反对它。那个函数的返回值是一个rvalue。 你现在可能会问 - 前缀operator ++有什么问题?它不也是返回一个值的函数吗?答案是 - 不是。前缀operator ++返回一个引用,而不是一个复制的值,因此它的“结果”可以与操作数&一起使用。

更具体地说,i++ 是一个 prvalue 表达式。 - wally

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接