繁体   English   中英

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

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

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

我对此的理解是,该表达式将首先评估 a+b,将该值存储在 a 中,然后将其递增。 这里发生了什么?

这是错误1

a++ += b

因为a++返回一个临时的(一个pr-value )语言禁止你修改,因为一旦完整的表达式被评估,它就会被丢弃。 这是一种故障安全。


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

不,它没有。 根据 运算符优先级+++=之前计算。


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

对于内置类型,这是一个编译时错误,因为赋值需要一个左值,而 a++(这是由于首先评估运算符优先级)是一个右值。 在您的示例中,编译器将发出这样的错误,请参阅 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++ 现在产生一个左值。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM