Что происходит с этим выражением? b = a + (a = a + 5)

a = 5
b = a + (a = a + 5)

результат b = 15

Почему первый "а" после этого не изменяется (a = a + 5)? Но почему второй меняется? Что именно происходит здесь по шагам?

Ответ 1

Выражения оцениваются слева направо - всегда, независимо от группировки. Таким образом, это эквивалентно:

a = 5;

int lhs = a; // 5
int rhs = (a = a + 5); // Increments a by 5 (i.e. a=10), and rhs=10
b = lhs + rhs; // 15

Итак, после этого, a будет 10. Но это происходит только после того, как a был оценен для первого операнда основного сложения, поэтому результат равен 15, а не 20.

Очень важно понять, что часть оценочного порядка не совпадает с приоритетом. Рассмотрим это:

int x = First() + Second() * Third();

Приоритет означает, что умножение применяется к результатам вызова Second() и Third() - но First() по-прежнему оценивается первым. Другими словами, это утверждение эквивалентно:

int lhs = First();
int rhs = Second() * Third();
int x = lhs + rhs;

Подробнее см. сообщение блога Эрика Липперта о предрассудстве, ассоциативности и упорядочении.

Я бы настоятельно советовал не писать такой код.

Ответ 2

В отличие от C и С++ порядок оценки подвыражений слева на С#. Поэтому выражение

j= ++i + ++i ;   

имеет хорошо определенное поведение в С#, а undefined - в C и С++.

В выражении

b = a + (a = a + 5)  

left a будет оцениваться первым, тогда a+5 оценивается и присваивается a, и после добавления как оцененного подвыражения b будет иметь значение 15.

Ответ 3

Выражение всегда оценивается слева направо и затем присваивается всем, что находится слева. Как

  a = 5
  b = a + (a = a + 5)
\\b = 5 + (a = 5 + 5)
  b = 15

Ответ 4

Мы всегда работаем слева направо, только части группы Parens из суммы. Просто помните, что всегда идите влево. Я пошел шаг за шагом ниже

начните с вопроса

a = 5

b = a + (a = a + 5)

Итак, теперь измените первый "a" на 5

b = 5 + (a = a + 5)

теперь позволяет делать сумму в parens

b = 5 + (a = 5 + 5)

Это дает нам

b = 5 + 10 или вы могли бы сказать b = 5 + (a = 10)

, и ответ

b = 15

также теперь

a = 10