интервал x = 10; x + = x-; в .NET - Почему?

int x = 10;
x += x--;

В C#/.Net, почему это равняется тому, чему это равняется? (Я намеренно пропускаю ответ, таким образом, можно предположить и видеть, правы ли Вы),

33
задан Tom Ritter 19 February 2010 в 20:48
поделиться

5 ответов

Посмотрите на это утверждение:

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 - и это гарантируется спецификацией.

Что также в значительной степени гарантировано, хотя и не по спецификации, так это то, что любой, кто использует такой код, будет атакован своими коллегами. Да, хорошо, что результат предсказуем. Нет, использовать такой код нехорошо.

53
ответ дан 27 November 2019 в 17:40
поделиться

Джон, конечно, прав.

Хороший способ подумать об этом - запомнить:

1) подвыражения всегда оцениваются слева направо. Точка. Оценка подвыражения может вызвать побочный эффект.

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

"x" слева от += является самым левым подвыражением, поэтому действует правило (1). Его значение вычисляется первым -- 10.

x-- справа от += является следующим по порядку слева направо, поэтому его значение вычисляется следующим. Значение x-- равно 10, и побочным эффектом является то, что x становится равным 9. Так и должно быть, потому что -- имеет более высокий приоритет, чем +=, поэтому его побочный эффект выполняется первым.

Наконец, побочный эффект += выполняется последним. Два операнда были 10 и 10, поэтому результатом будет присвоение 20 к x.

Мне постоянно задают вопросы об этом. Помните, что правила очень просты: подвыражения слева направо, операторы в порядке старшинства, точка.

В частности, обратите внимание, что часто встречающееся рассуждение "оператор -- является постфиксным и поэтому идет после всех остальных" является неверным. Я обсуждаю, почему это неверно, в статьях ниже.

Вот некоторые статьи, которые я написал на эту тему:

http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx

15
ответ дан 27 November 2019 в 17:40
поделиться

20; "--" происходит только после того, как все будет оценено, и это значение перезаписывается левой частью равно.

14
ответ дан 27 November 2019 в 17:40
поделиться

Из спецификации 7.13.2

Если тип возврата выбранного оператора неявно преобразуется в тип 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.

10
ответ дан 27 November 2019 в 17:40
поделиться

Ответ - 20. И Том, вы действительно не так удивлены, как кажется из вашего вопроса, верно? А тем из вас, кто предполагает, что ответ 19 - я думаю, вы путаете x += --x;

0
ответ дан 27 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: