pre/postfix 增量的左值和右值
lvalue and rvalue for pre/postfix increment
学习左值和右值。定义是任何可以是 "address of" 的是左值,否则是右值。
我检查了运算符的优先级,前缀和后缀增量都比 "address of" 运算符具有更高的优先级。
对于下面的两个例子,谁能解释一下为什么第一个“&++value1”是左值而第二个“&value1++”是右值。
我对这两种情况的错误理解是:pValue1 指向 value1 变量。无论在建立地址关联之前还是之后将value1改为8,value1变量总是占用一个内存位置,我们可以推导出它的地址,对吧?
int value1=7;
int *pValue1=&++value1;
int *pValue1 = &value1++;
根据我的评论,您可以了解为什么编译器反对这种操作。问题在于后缀 operator ++
的一般实现,它复制对象(在本例中为 int
),增加原始对象和 returns preincremented copy。您可以将其视为按以下方式定义的函数:
int foo_operator(int& a)
{
int copy = a;
a += 1;
return copy;
}
如果您尝试在您的示例中使用该函数,您的编译器也会反对它。该函数的 return 值是一个 rvalue.
您现在可能会问 - 前缀 operator ++
怎么了?这不也是一个 return 是一个值的函数吗? 答案是 - 否 。前缀operator ++
returns 引用,不是复制值,因此它的'outcome'可以和操作数&
一起使用。
学习左值和右值。定义是任何可以是 "address of" 的是左值,否则是右值。
我检查了运算符的优先级,前缀和后缀增量都比 "address of" 运算符具有更高的优先级。
对于下面的两个例子,谁能解释一下为什么第一个“&++value1”是左值而第二个“&value1++”是右值。
我对这两种情况的错误理解是:pValue1 指向 value1 变量。无论在建立地址关联之前还是之后将value1改为8,value1变量总是占用一个内存位置,我们可以推导出它的地址,对吧?
int value1=7;
int *pValue1=&++value1;
int *pValue1 = &value1++;
根据我的评论,您可以了解为什么编译器反对这种操作。问题在于后缀 operator ++
的一般实现,它复制对象(在本例中为 int
),增加原始对象和 returns preincremented copy。您可以将其视为按以下方式定义的函数:
int foo_operator(int& a)
{
int copy = a;
a += 1;
return copy;
}
如果您尝试在您的示例中使用该函数,您的编译器也会反对它。该函数的 return 值是一个 rvalue.
您现在可能会问 - 前缀 operator ++
怎么了?这不也是一个 return 是一个值的函数吗? 答案是 - 否 。前缀operator ++
returns 引用,不是复制值,因此它的'outcome'可以和操作数&
一起使用。