Принцип работы постинкремента

В ДЗ к 3 урока Си Шарп Стартовый есть вот такое задание. Вычислить

x = y - x * z

если x = 10, y = 12, z = 3;

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

-7

В то время как после просмотра урока Константина по выполнению ДЗ, на самом дело получилось

-8

x = 12 - 30 = 10 - 18 = -8

На самом деле моя ошибка была в том, что в первое использование X я брал его равным 10, а вот второй раз, я его уже взял за 11 (сделав операцию увеличения на 1).

Перенёс формулу (x = y - x * z) в VS и действительно получил -8

Начал разбирать

Выражение

x = y - x * z

равносильно

x =x (y - x * z); // Ведь так???

В этом случае

также получил -8

но вот если переменить местами

x = (y - x * z) x

то уже получаем такой результат, как и получил я в первый раз -7.

Это что получается, от перемены мест слагаемых сумма не меняется?

Это связанно с тем как компилятор вычисляет это выражение, C# преобразуется в IL код и это выражение разбивается на последовательность IL команд, поэтому получаются такие эффекты. Через ildasm можно увидеть это.

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

Вот подобный пример

int x = 0;

int y = 0;

x = x x;

y = y y;

Console.WriteLine(x);

Console.WriteLine(y);

Но это на самом деле не проблема, так как подобные примеры встречаются только в учебных задачах какраз с целью демонстрации этих особенностей. В реальных проектах за такое уволят)))

Кстати возможно по этому в swift и убрали инкремент и декремент, чтоб было меньше возможности запутатся.

как по мне, удобная штука этот инкремент, в VBA его сильно не хватает =)