为什么 a++(post-增量运算符)不能是左值?
Why can't a++ (post-increment operator) be an Lvalue?
代码
#include<iostream>
int main()
{
int a=3;
a++=5;
std::cout<<a;
}
输出(符合预期)
[Error] lvalue required as left operand of assignment
1. post 增量运算符 (a++
) 在 table 中具有最高优先级。所以肯定会在赋值运算符(=
)之前执行。并且根据 post 递增的规则,变量 a
的值只会在执行该语句后递增。
那么当 post 增量运算符 (++
) 时究竟发生了什么
在赋值运算符 (=
)?
之前执行
2.
在 C 中,预增量运算符和 post 增量运算符都会产生右值,但 C++ 将预增量运算符更新为左值,同时保持post-增量运算符仅作为右值。这样做的原因是我们不能使它成为左值,因为它只拥有旧值,而不是更新后的值。但是我不太理解这个原因。
现在看到 a++
有右值 3,不是变量本身,对吧?但是如果它带来一个拥有左值的变量,那么 5 将插入其中,并且在语句结束后它的值将是 6。这有什么问题,为什么不能这样做?
And As per rule of post increment the value of variable a will increment only after execution of that statement.
这有点误导。变量立即递增。但是表达式的结果是旧值。这应该更容易理解为什么它不能是左值。修改后的对象没有旧值,因此假设的左值不能引用该对象。该值是一个新的临时对象;它是一个纯右值。
作为一个类比,考虑编写一个与 post 增量相同的函数。这就是它的编写方式(如果您为 class 定义重载运算符重载,那么像这样的函数实际上就是您要编写的内容,只需进行一些更改):
int post_increment(int& operand)
{
int old = operand;
operand += 1;
return old;
}
您如何才能将该函数有意义地重写为 return 一个左值(参考)并且仍然具有 post 增量所期望的行为?
代码
#include<iostream>
int main()
{
int a=3;
a++=5;
std::cout<<a;
}
输出(符合预期)
[Error] lvalue required as left operand of assignment
1. post 增量运算符 (a++
) 在 table 中具有最高优先级。所以肯定会在赋值运算符(=
)之前执行。并且根据 post 递增的规则,变量 a
的值只会在执行该语句后递增。
那么当 post 增量运算符 (++
) 时究竟发生了什么
在赋值运算符 (=
)?
2. 在 C 中,预增量运算符和 post 增量运算符都会产生右值,但 C++ 将预增量运算符更新为左值,同时保持post-增量运算符仅作为右值。这样做的原因是我们不能使它成为左值,因为它只拥有旧值,而不是更新后的值。但是我不太理解这个原因。
现在看到 a++
有右值 3,不是变量本身,对吧?但是如果它带来一个拥有左值的变量,那么 5 将插入其中,并且在语句结束后它的值将是 6。这有什么问题,为什么不能这样做?
And As per rule of post increment the value of variable a will increment only after execution of that statement.
这有点误导。变量立即递增。但是表达式的结果是旧值。这应该更容易理解为什么它不能是左值。修改后的对象没有旧值,因此假设的左值不能引用该对象。该值是一个新的临时对象;它是一个纯右值。
作为一个类比,考虑编写一个与 post 增量相同的函数。这就是它的编写方式(如果您为 class 定义重载运算符重载,那么像这样的函数实际上就是您要编写的内容,只需进行一些更改):
int post_increment(int& operand)
{
int old = operand;
operand += 1;
return old;
}
您如何才能将该函数有意义地重写为 return 一个左值(参考)并且仍然具有 post 增量所期望的行为?