Почему выражение «a ++ + = b» дает ошибку? - PullRequest
0 голосов
/ 29 января 2019
#include <iostream.h>
int main()
{
  int a = 2;
  int b = 3;
  a++ += b;
  std::cout << a;
}

Мое понимание этого состояло в том, что это выражение сначала будет оценивать a + b, сохранять это значение в a, а затем увеличивать его.Что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Для типов встраивания это ошибка времени компиляции, так как для присвоения требуется lvalue, а a ++ (что обусловлено приоритетом оператора, вычисляемого первым), является rvalue.В вашем примере компилятор выдаст ошибку, подобную этой , см. Compiler-explorer :

<source>: In function 'int main()':

<source>:6:9: error: lvalue required as left operand of assignment

6 |  a++ += b;

  |         ^

Compiler returned: 1

Если у вас есть пользовательский тип (в данном случае бессмыслица, но для демонстрации), который выглядит какthis

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;
}

Он компилируется без проблем, так как теперь ++ возвращает lvalue.

0 голосов
/ 30 января 2019

Помимо неправильной точки входа и заголовка, с этим кодом есть две проблемы.

a определяется как const, поэтому он не может быть lvalue, поэтому не может быть затронут ++ или + =оператор. Или любое задание.Это константа!

Оператор приращения ++ также не возвращает значение l, поэтому его результат не может быть аргументом операторов присваивания.

0 голосов
/ 29 января 2019

Это ошибка 1 :

a++ += b

, потому что a++ возвращает временное ( pr-значение ) язык, который вам запрещено изменять, посколькуоно отбрасывается, как только полное выражение было оценено.Это своего рода отказоустойчивость.


Насколько я понимаю, это выражение должно было сначала вычислить a + b, сохранить это значение в a, а затем увеличить его.

Нет, это не так.В соответствии с операторскими приоритетами , ++ вычисляется до +=.


1) В этом ответе предполагается, что a и b являются встроенными типамиили хорошо определяемые пользователем типы классов.

...