Является ли поведение return x ++; определены?

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

class Foo
{

   ...

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

Является ли поведение возвращаемой переменной с последующим приращением?

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

Да.

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

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

Изменение: Вы можете сравнить определение предварительного и поста приращения в ссылках.

Ответ 4

Определяется.

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

Ответ 5

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

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

Ответ 6

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

#include <iostream>
#include <cstdlib>

using namespace std;

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

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

    return 0;
}

Ответ 7

Я знаю, что на этот вопрос уже давно дан ответ, но вот почему он определен. Составные операторы в основном являются синтаксическим сахаром для функций. Если вам интересно, как происходит приращение после возврата из функции, это не так. Это происходит как раз перед тем, как оператор "функция" возвращает предыдущее значение.

Для целого числа подумайте о функции оператора постинкремента, определенной следующим образом:

int post_increment(int *n)
{
    temp = *n;
    *n = *n + 1;
    return temp;
}