【问题标题】:Why does the expression 'a++ += b' give an error?为什么表达式 'a++ += b' 会出错?
【发布时间】:2019-06-22 15:51:03
【问题描述】:
#include <iostream.h>
int main()
{
  int a = 2;
  int b = 3;
  a++ += b;
  std::cout << a;
}

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

【问题讨论】:

  • 什么错误?什么a?什么b?
  • 请发帖mcve...
  • 取决于 a 和 b 的类型,这个表达式实际上可以做任何事情。答案假设它们是内置的数字类型,但你真的应该包括一个minimal reproducible example
  • 编译好here :-)
  • 这不是任何未定义行为的重复。此代码不允许在标准 C++ 中编译。重新打开。

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


【解决方案1】:

对于内置类型,这是一个编译时错误,因为赋值需要一个左值,而 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】:

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

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

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

    【讨论】:

    • 在 OPs 问题中它最初是 b++ ...所以你不应该指出这一点
    • Q 上有一些不好的编辑。我已将它与 Pi 的答案一起修复,因此所有内容都与问题的标题相符。
    【解决方案3】:

    这是一个错误1:

    a++ += b
    

    因为a++ 返回一个临时的(pr-value),该语言禁止您修改,因为它在评估完整表达式后立即被丢弃。这是一种故障保险。


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

    不,它没有。根据operator precedences,++ 在+= 之前求值。


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

    【讨论】:

    • 这是真的。对于内置类型,这是正确的。对于用户类型,它不一定是。
    • @NathanOliver 有时我更喜欢简单的半真半假而不是复杂的完整的。
    • 鉴于 OP 提供的信息很少,我认为可以公平地假设 a 和 b 是 int 或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2016-04-28
    • 2022-07-23
    • 2023-02-22
    • 2014-03-29
    相关资源
    最近更新 更多