2017-09-07 56 views
1

学习左值和右值。定义是什么可以是“地址”是左值,否则,它是右值。前/后缀增量的左值和右值

我检查了运算符优先级,前缀和后缀增量的优先级都高于“运算符的地址”。

对于以下两个示例,任何人都可以解释一下为什么第一个“& ++ value1”是一个左值,而第二个“& value1 ++”是右值。

我对这两种情况的错误理解是:pValue1指向value1变量。在建立地址关联之前或之后,无论value1变为8,value1变量总是占用一个内存位置,我们可以得到它的地址,对吗?

int value1=7; 

int *pValue1=&++value1; 

int *pValue1 = &value1++; 
+2

postfix'operator ++'返回一个预增量副本,而不是对增量对象的引用 – Fureeish

+0

不直接相关,但是您的“左值”定义不完整。位域是左值,但你不能得到他们的地址。 – HolyBlackCat

回答

2

根据我的评论,你可以看到为什么编译器会反对这种操作。问题在于postfix operator ++的一般实现,它复制对象(在这种情况下为int),增加原始对象并返回预先加密的副本。你可以认为它像在这样定义的函数:

int foo_operator(int& a) 
{ 
    int copy = a; 
    a += 1; 
    return copy; 
} 

如果您尝试使用该功能在你的榜样,你的编译器也将抗议它。该函数的返回值是右值

您现在可能会问 - 怎么了前缀operator ++?那也不是一个返回值的函数吗?答案将是 - 。前缀operator ++返回参考,而不是复制的值,因此它的'结果'可以与操作数&一起使用。