Поведение return x ++; определены? - PullRequest
21 голосов
/ 04 марта 2010

Если у меня есть, например, класс с методом экземпляра и переменными

class Foo
{

   ...

   int x;
   int bar() { return x++; }
 };

Определено ли поведение возврата постинкрементной переменной?

Ответы [ 6 ]

40 голосов
/ 04 марта 2010

Да, это эквивалентно:

int bar()
{
  int temp = x;
  ++x;
  return temp;
}
7 голосов
/ 04 марта 2010

Да, это так ... он будет возвращать значение x перед его увеличением, и после этого значение x будет + 1 ..., если это имеет значение.

5 голосов
/ 04 марта 2010

Да.

В postincrement (x ++) значение x оценивается (возвращается в вашем случае) до добавления 1.

В preincrement (++ x) значение x оценивается после добавления 1.

Редактировать : Вы можете сравнить определение pre и post приращения в ссылках.

4 голосов
/ 04 марта 2010

Это определено.

Возвращает значение x до приращения.Если x является локальной (нестатической) переменной, это постинкрементное изменение не имеет никакого эффекта, поскольку локальные переменные функции перестают существовать, как только функция возвращается.Но если x является локальной статической переменной, глобальной переменной или переменной экземпляра (как в вашем случае), ее значение будет увеличиваться после возврата.

2 голосов
/ 04 марта 2010

Большинство языков программирования, таких как C ++, рекурсивны в том порядке, в котором выполняются операции (здесь я не делаю никаких выводов о том, как код фактически реализуется компилятором). Сложные операции, которые состоят из любых четко определенных операций, сами по себе хорошо определены, поскольку каждая операция выполняется по принципу «последний пришел - первый вышел».

Постинкремент возвращает значение переменной, которая увеличивается до , увеличивая его, поэтому операция return получает это значение. Специального определения этого поведения не требуется.

0 голосов
/ 20 июля 2018

Я думаю, что это определено, но не является предпочтительным. Это вызывает замешательство у людей. Например, следующий код печатает 1 вместо 2.

#include <iostream>
#include <cstdlib>

using namespace std;

int foo()
{
    int i = 1;
    return i++;
}

int main()
{
    cout << foo() << endl;

    return 0;
}
...