a = 5
b = a + (a = a + 5)
результат b = 15
Почему первый "а" после этого не изменяется (a = a + 5)? Но почему второй меняется? Что именно происходит здесь по шагам?
a = 5
b = a + (a = a + 5)
результат b = 15
Почему первый "а" после этого не изменяется (a = a + 5)? Но почему второй меняется? Что именно происходит здесь по шагам?
Выражения оцениваются слева направо - всегда, независимо от группировки. Таким образом, это эквивалентно:
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;
Подробнее см. сообщение блога Эрика Липперта о предрассудстве, ассоциативности и упорядочении.
Я бы настоятельно советовал не писать такой код.
В отличие от C и С++ порядок оценки подвыражений слева на С#. Поэтому выражение
j= ++i + ++i ;
имеет хорошо определенное поведение в С#, а undefined - в C и С++.
В выражении
b = a + (a = a + 5)
left a
будет оцениваться первым, тогда a+5
оценивается и присваивается a
, и после добавления как оцененного подвыражения b
будет иметь значение 15
.
Выражение всегда оценивается слева направо и затем присваивается всем, что находится слева. Как
a = 5
b = a + (a = a + 5)
\\b = 5 + (a = 5 + 5)
b = 15
Мы всегда работаем слева направо, только части группы 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