为什么表达式“ a ++ + = b”给出错误?

时间:2019-01-29 13:40:14

标签: c++ compiler-errors syntax-error

#include <iostream.h>
int main()
{
  int a = 2;
  int b = 3;
  a++ += b;
  std::cout << a;
}

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

3 个答案:

答案 0 :(得分:8)

这是一个错误 1

a++ += b

因为a++返回一个临时语言(a pr-value),该语言禁止您修改该语言,因为一旦对完整表达式求值就将其丢弃。这是一种故障保险。


  

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

不,不是。根据{{​​3}},+++=之前评估。


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

答案 1 :(得分:0)

对于内建类型,这是一个编译时错误,因为赋值需要一个左值,而a ++(这是由于首先评估了运算符的优先级)是一个右值。在您的示例中,编译器将发出类似see compiler-explorer的错误:

<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 ++现在会产生一个左值。

答案 2 :(得分:0)

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

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

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