【问题标题】:Why can't a++ (post-increment operator) be an Lvalue?为什么 a++(后自增运算符)不能是左值?
【发布时间】: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


【解决方案1】:

并且根据 post increment 的规则,变量 a 的值只有在执行该语句后才会增加。

这有点误导。变量立即递增。但是表达式的结果是旧值。这应该更容易理解为什么它不能是左值。修改后的对象没有旧值,因此假设的左值不能引用该对象。该值是一个新的临时对象;这是一个prvalue。

作为一个类比,考虑编写一个与后增量执行相同操作的函数。这就是它的写法(如果你为一个类定义了重载的运算符重载,那么像这样的函数就是你要写的,只是做了一些改动):

int post_increment(int& operand)
{
    int old = operand;
    operand += 1;
    return old;
}

您如何有意义地重写该函数以返回一个左值(引用)并且仍然具有后期增量所期望的行为?

【讨论】:

  • 谢谢。你太棒了,你解释的方式太棒了。
猜你喜欢
  • 2016-11-25
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2011-11-15
  • 2013-02-23
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多