Java - круглые скобки и присваивание
Код:
int r=1;
System.out.println(r + (r=2));
Вывод: 3. Но я ожидал 4, потому что я думал, что код в скобках выполняется первым?
5 ответов
Официальные документы по операторам говорят
Все бинарные операторы, кроме операторов присваивания, оцениваются слева направо; операторы присваивания оцениваются справа налево.
Так +
оценивается left-to-right
где оцениваются операторы присваивания right to left.
Используйте это, если хотите 4
int r=1;
System.out.println((r=2) + r); // execute + is left-to-right
Ассоциативность +
слева направо, и значение выражения (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)
оценивается перед умножением.