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

  • 68 Просмотры
  • Последний пост 03 ноября 2016
Артём Мацун разместил пост 03 ноября 2016

В ДЗ к 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.

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

 

Прикрепленные файлы

Отсортировать по: Стандартный | Последний | Голоса
Seva 1986 разместил пост 03 ноября 2016

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

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

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

int x = 0;

int y = 0;

x = x + ++x;

y = ++y + y;

Console.WriteLine(x);

Console.WriteLine(y);

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

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

Артём Мацун разместил пост 03 ноября 2016

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

Close