Ответ 1
Да, это эквивалентно:
int bar()
{
int temp = x;
++x;
return temp;
}
Если у меня есть класс с методом экземпляра и переменными
class Foo
{
...
int x;
int bar() { return x++; }
};
Является ли поведение возвращаемой переменной с последующим приращением?
Да, это эквивалентно:
int bar()
{
int temp = x;
++x;
return temp;
}
Да, это... он вернет значение x до его увеличения, а после этого значение x будет равно + 1... если это имеет значение.
Да.
В postincrement
(x++) значение x оценивается (возвращается в вашем случае) до добавления 1.
В preincrement
(++x) значение x оценивается после добавления 1.
Изменение: Вы можете сравнить определение предварительного и поста приращения в ссылках.
Определяется.
Возвращает значение x
до инкремента. Если x
является локальной (нестатической) переменной, эта пошаговая инкрементация не имеет никакого эффекта, поскольку локальные переменные функции перестают существовать после возвращения функции. Но если x
- локальная статическая переменная, глобальная переменная или переменная экземпляра (как в вашем случае), ее значение будет увеличено после возврата.
Большинство языков программирования, таких как С++, являются рекурсивными в том порядке, в котором выполняются операции (я не делаю никаких сомнений о том, как код действительно реализован компилятором здесь). Составные операции, которые состоят из любых четко определенных операций, сами по себе четко определены, так как каждая операция выполняется по принципу "последний, первый".
Пост-инкремент возвращает значение переменной, увеличивающееся до его приращения, поэтому операция return
получает это значение. Никакое специальное определение этого поведения не должно быть сделано.
Я думаю, что это определено, но не является предпочтительным. Это вызывает замешательство у людей. Например, следующий код печатает 1 вместо 2.
#include <iostream>
#include <cstdlib>
using namespace std;
int foo()
{
int i = 1;
return i++;
}
int main()
{
cout << foo() << endl;
return 0;
}
Я знаю, что на этот вопрос уже давно дан ответ, но вот почему он определен. Составные операторы в основном являются синтаксическим сахаром для функций. Если вам интересно, как происходит приращение после возврата из функции, это не так. Это происходит как раз перед тем, как оператор "функция" возвращает предыдущее значение.
Для целого числа подумайте о функции оператора постинкремента, определенной следующим образом:
int post_increment(int *n)
{
temp = *n;
*n = *n + 1;
return temp;
}