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 + (r=2))
(1 + (r=2))
(1 + (2))
(3)

Ассоциативность + слева направо, и значение выражения (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) оценивается перед умножением.

Другие вопросы по тегам