为什么表达式 'a++ += b' 会给出错误?

Why does the expression 'a++ += b' give an error?

本文关键字:出错 错误 表达式 a++ 为什么      更新时间:2023-10-16
#include <iostream.h>
int main()
{
  int a = 2;
  int b = 3;
  a++ += b;
  std::cout << a;
}

我对此的理解是,这个表达式将首先计算 a+b,将该值存储在 a 中,然后递增它。这是怎么回事?

这是一个错误1

a++ += b

由于a++返回临时(PR 值),因此该语言禁止您修改,因为一旦计算完整表达式,它就会被丢弃。这是一种故障保险。


我对此的理解是,这个表达式将首先计算 a+b,将该值存储在 a 中,然后递增它。

不,它没有。根据运算符优先级,+++=之前进行评估。


1)这个答案假设ab是内置类型或行为良好的用户定义类类型。

除了错误的入口点和标头之外,此代码还存在两个问题。

a被定义为const因此它不能是左值,因此不受++或+=运算符的影响。或任何作业。这是一个常数!

增量运算符 ++ 也不返回左值,因此其结果不能是赋值运算符的参数。

对于内置类型,这是一个编译时错误,因为分配需要一个左值,而 a++(这是由于首先计算运算符优先级)是一个右值。在您的示例中,编译器将发出如下错误,请参阅编译器资源管理器:

<source>: In function 'int main()':
<source>:6:9: error: lvalue required as left operand of assignment
6 |  a++ += b;
  |         ^
Compiler returned: 1

如果你有一个自定义类型(在这种情况下是废话,但用于演示),看起来像这样

class A
{
    public:
    A operator++(int)
    {
        return A{};
    }
    A operator+=(const A&)
    {
        return A{};
    }
    int i;
};
int main()
{
    A a;
    A b;
    a++ += b;
    return 0;
}

它编译没有问题,因为 a++ 现在产生一个左值。

相关文章: