int x = 10;
x += x--;
В C#/.Net, почему это равняется тому, чему это равняется? (Я намеренно пропускаю ответ, таким образом, можно предположить и видеть, правы ли Вы),
Посмотрите на это утверждение:
x += x--;
Это эквивалентно:
x = x + x--;
Что эквивалентно:
int a1 = x; // a1 = 10, x = 10
int a2 = x--; // a2 = 10, x = 9
x = a1 + a2; // x = 20
Итак, x
после этого будет 20 - и это гарантируется спецификацией.
Что также в значительной степени гарантировано, хотя и не по спецификации, так это то, что любой, кто использует такой код, будет атакован своими коллегами. Да, хорошо, что результат предсказуем. Нет, использовать такой код нехорошо.
Джон, конечно, прав.
Хороший способ подумать об этом - запомнить:
1) подвыражения всегда оцениваются слева направо. Точка. Оценка подвыражения может вызвать побочный эффект.
2) выполнение операторов всегда происходит в порядке, указанном скобками, старшинством и ассоциативностью. Выполнение операторов может вызвать побочный эффект.
"x" слева от += является самым левым подвыражением, поэтому действует правило (1). Его значение вычисляется первым -- 10.
x-- справа от += является следующим по порядку слева направо, поэтому его значение вычисляется следующим. Значение x-- равно 10, и побочным эффектом является то, что x становится равным 9. Так и должно быть, потому что -- имеет более высокий приоритет, чем +=, поэтому его побочный эффект выполняется первым.
Наконец, побочный эффект += выполняется последним. Два операнда были 10 и 10, поэтому результатом будет присвоение 20 к x.
Мне постоянно задают вопросы об этом. Помните, что правила очень просты: подвыражения слева направо, операторы в порядке старшинства, точка.
В частности, обратите внимание, что часто встречающееся рассуждение "оператор -- является постфиксным и поэтому идет после всех остальных" является неверным. Я обсуждаю, почему это неверно, в статьях ниже.
Вот некоторые статьи, которые я написал на эту тему:
http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx
20; "--" происходит только после того, как все будет оценено, и это значение перезаписывается левой частью равно.
Если тип возврата выбранного оператора неявно преобразуется в тип x, операция оценивается как x = x op y, за исключением того, что x оценивается только один раз.
Таким образом, ваше утверждение эквивалентно x = x + x--;
которое оценивается в порядке слева направо и дает ответ 20.
Обратите внимание, что здесь также есть разница между --x
и x--
. Если бы вы написали x += --x;
, это было бы эквивалентно x = x + --x
; тогда вы получили бы 19. Это происходит потому, что значение x уменьшается и полученное значение используется в выражении (в отличие от x--
, где в выражении используется исходное значение x).
Это выражение x = x + --x + x
даст 28, потому что в третий разв четвертый раз (см. комментарии) x оценивается в 9.
Ответ - 20. И Том, вы действительно не так удивлены, как кажется из вашего вопроса, верно? А тем из вас, кто предполагает, что ответ 19 - я думаю, вы путаете x += --x;