前/后缀增量的左值和右值

学习左值和右值。 定义是什么可以是“地址”是左值,否则,它是右值。

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

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

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

int value1=7;

int *pValue1=&++value1;

int *pValue1 = &value1++;

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

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

如果你尝试在你的例子中使用这个函数,你的编译器也会抗议它。 该函数的返回值是一个右值

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

链接地址: http://www.djcxy.com/p/40299.html

上一篇: lvalue and rvalue for pre/postfix increment

下一篇: Can't make a function accept both rvalue and lvalue references