【发布时间】:2021-09-26 13:17:43
【问题描述】:
代码
#include<iostream>
int main()
{
int a=3;
a++=5;
std::cout<<a;
}
输出(如预期)
[Error] lvalue required as left operand of assignment
1. 后自增运算符 (a++) 在表中具有最高优先级。所以它肯定会在赋值运算符(=)之前执行。并且根据后递增规则,变量a 的值只有在执行该语句后才会递增。
那么当后自增运算符 (++)
在赋值运算符 (=) 之前执行?
2. 在 C 中,前自增运算符和后自增运算符都会产生右值,但 C++ 将前自增运算符更新为左值,同时将后自增运算符保留为右值。原因是我们不能让它成为左值,因为它只拥有旧值,而不是更新后的值。但是我没有正确理解这个原因。
现在看到a++ 的右值是 3,而不是变量本身,对吧?但是如果它带来一个拥有左值的变量,那么 5 将插入到该变量中,并且在语句结束后它的值将是 6。这有什么问题,为什么不能这样做?
【问题讨论】:
-
我把你的问题跟踪到 "... 但是如果它带来了具有左值的变量,那么 5 将插入其中,并且在语句结束后它的值将是 6..." 你能扩展一下吗?
-
后缀操作的结果是 previous 值(增量之前)。这是一个非常临时的中间值。
-
本质上,表达式
a++=5有点类似于{ int temp = a; a += 1; temp = 5; }请注意这个temp变量的范围和生命周期。它比这复杂一点,但应该很容易发现它不会很有用。 -
(a=5)++;不会做这项工作吗? ;-) -
@Someprogrammerdude 谢谢我明白了。
标签: c++ rvalue lvalue post-increment