В ДЗ к 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 его сильно не хватает =)