Код:Java - круглые скобки и назначение
int r=1;
System.out.println(r + (r=2));
Выход: 3. Но я ожидал, 4, потому что я думал, что код внутри скобок выполняется первым?
Код:Java - круглые скобки и назначение
int r=1;
System.out.println(r + (r=2));
Выход: 3. Но я ожидал, 4, потому что я думал, что код внутри скобок выполняется первым?
Official Docs on Operators says
Все бинарные операторы для операторов присваивания, кроме вычисляются слева направо; операторы присваивания оцениваются справа налево.
Так +
оценивается left-to-right
, где, как операторы присваивания оцененных right to left.
Используйте это, если вы хотите 4
int r=1;
System.out.println((r=2) + r); // execute + is left-to-right
Ассоциативность + слева направо –
Не могли бы вы объяснить, как он оценивает '4'? Я не мог понять, как он работает. Исходя из моего понимания, я предполагаю, что он будет работать так: '((r = 2) + r) => (2 + r) => (2 + 1) = 3'. Пожалуйста, дополните. Спасибо – John
@John 'r = 2' присваивает 2' r'. Поэтому в следующий раз используется 'r', его значение равно 2. – user3932000
Ассоциативность +
находится слева-направо, а значение выражения (r=2)
является 2
.
См JLS 15.7
Левый операнд бинарного оператора, как представляется, в полной мере оценены до какой-либо части правого операнда вычисляется.
Если оператор является оператором составного присваивания (§15.26.2), то оценка левого операнда включает в себя как запоминание переменной, которую левый операнд обозначает, так и выборку и сохранение значения этой переменной для использования в подразумеваемая двоичная операция.
Если оценка левого операнда двоичного оператора завершается внезапно, ни одна часть правого операнда не была оценена.
Значение инструкции r=2
равно 2. Вложенные выражения между скобками обрабатываются сначала.
Например:
int r=2;
System.out.println(r * (r=2 + 1));
Выход:
6
Почему? Потому что r = 2 + 1
возвращает 3
.
То же, что:
int r=2;
System.out.println(r * (2 + 1));
Выход еще 6
потому (2 + 1)
вычисляется перед умножением.
Executed первого? Нет, круглые скобки влияют только на ассоциативность. Java всегда оценивает операнды слева направо. – johnchen902
Почему вы ожидаете 4? просто любопытно ... – oliverdejohnson
Thx all ... Моя презумпция того, что код в круглых скобках выполняется, сначала была неправильной. – BigJ