#cpp #инкремент
Почему функция int f(int k) { return k++; } возвращает значение k вместо k+1, даже если записать ее в виде: int f(int k) { return (k++); } ?
Ответы
Ответ 1
Именно потому что это постинкремент. Результат постинкремента - это значение до изменения. Наличие дополнительных скобок не меняет значения выражения. Если бы Вы записали: k++; return k; то вернулось бы уже инкрементированное значение, т.к. после ; переменная уже изменится. Понимание эффекта возможно упростит использование функции вместо постинкремента вида: int inc(int i) { int t = i; i = i + 1; return t; }Ответ 2
Потому что постфиксный инкремент дает в качестве значения выражения значение переменной до инкремента. Вот и все. Хотите возвращать k+1 - пишите return ++k;...Ответ 3
В этом заключается смысл различия между пре-инкрементным оператором и пост-инкрементным оператором. Пост-инкрементный оператор возвращает значение переменной до ее инкремента. Из стандарта c++ (5.2.6 Increment and decrement) 1 The value of a postfix ++ expression is the value of its operand. [Note: the value obtained is a copy of the original value —end note] Если бы переменная k была бы объявлена как глобальная переменная int k; int f(){ return k++; } то, действительно, после выхода из функции ее значение увеличилось бы на 1. Хотя тем не менее сама функция вернула бы исходное значение переменной. Рассмотрите следующую демонстрационную программу #includeint k = 0; int f(){ return k++; } int g( int k ){ return k++; } int main() { std ::cout << "f() = " << f() << std::endl; std ::cout << "k = " << k << std::endl; std::cout << std::endl; k = 0; std ::cout << "g( k ) = " << g( k ) << std::endl; std ::cout << "k = " << k << std::endl; return 0; } Вывод программы на консоль f() = 0 k = 1 g( k ) = 0 k = 0 Обе функции вернули одно и то же значение 0. После вызова первой функции k увеличилась на 1, так как функция имеет дело непосредственно с глобальной переменной. Во втором случае переменная k не изменилась, так как вторая функция имеет дело с копией значения переменной. Ее параметр - это локальная переменная функции.
Комментариев нет:
Отправить комментарий