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

116
20 января 2021, 09:20

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

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

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

Answer 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) ...
Answer 2

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

READ ALSO
Удалить подстроку c#

Удалить подстроку c#

Текст самого задания: Отредактировать заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с четными...

98
Как сделать выборку MySQL чтобы значения в колонке содержали значения из списка

Как сделать выборку MySQL чтобы значения в колонке содержали значения из списка

Есть 2 таблицы, из одной я могу выбрать список нужных мне id:

110
Изменение значения в элемента в массиве

Изменение значения в элемента в массиве

Подскажите пожалуйста, есть код, в этом коде, происходит разложение текста в массив, после чего идет проверка текста с изменением его согласно...

126
Не могу изменить несколько записей из БД

Не могу изменить несколько записей из БД

Есть таблица Фильмов,Актеров и таблица соединяющая ид фильма и ид актераЕсть разметка

124