Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Постфиксный декремент

#c_sharp


большая просьба помочь разобраться со следующим примером:

int a = -1;
a = a-- *a;


Почему консоль выводит ответ "2"?
    


Ответы

Ответ 1



В реальном коде крайне не рекомендуется в одном и том же выражении повторно использовать переменную, над которой выполняется операция инкремента или декремента. Объяснение Постфиксная операция работает так: Запоминаем значение операнда Изменяем операнд Подставляем в выражение запомненное значение Расставим скобки согласно приоритету операторов и начнем вычислять: a = (a--) * a // a: -1 a = -1 * a // a: -2 a = -1 * -2 // a: -2 a = 2 // a: -2 (все еще, потому что присвоение не отработало) В итоге a стало равно 2. Почему это плохо? А чтобы понимать, почему написание такого кода сравнимо с использованием goto (а по-моему, даже хуже), рассмотрим такой пример: a = a * (a--) // a: -1 Думаете, операция в скобках выполнится первой? Нет, операции в C# выполняются слева направо, приоритеты и скобки только устанавливают ассоциативность. Так что сначала в выражение подставится результат "вычисления" первого операнда. А в C++, если я правильно помню, это вообще undefined behavior. a = -1 * (a--) // a: -1 a = -1 * -1 // a: -2 a = 1 // a: -2 После того, как присвоение отработает, в a будет 1. Для тренировки предлагаю решить вручную классическую задачу int i = 5; i = ++i + ++i; Должно получиться 13. А когда использование этих операций допустимо? Когда вы не используете эту переменную в том же выражении, вы не будете думать, как второе ее вхождение подставится в это выражение. Пример: while (--i > 0) ...

Ответ 2



Постфиксный декремент возвращает значение переменной, данной на вход, а уже потом производит вычитание единицы из неё. Ход действий в данном случае: 1) a = -1; 2) a = a-- * a; 3) a = -1 * a; 4) Выполняется декремент, a = -2; 5) a = -1 * -2; 6) a = 2;

Комментариев нет:

Отправить комментарий