2013-07-23 4 views
2

Код:Java - круглые скобки и назначение

int r=1; 
System.out.println(r + (r=2)); 

Выход: 3. Но я ожидал, 4, потому что я думал, что код внутри скобок выполняется первым?

+0

Executed первого? Нет, круглые скобки влияют только на ассоциативность. Java всегда оценивает операнды слева направо. – johnchen902

+0

Почему вы ожидаете 4? просто любопытно ... – oliverdejohnson

+0

Thx all ... Моя презумпция того, что код в круглых скобках выполняется, сначала была неправильной. – BigJ

ответ

3

Official Docs on Operators says

Все бинарные операторы для операторов присваивания, кроме вычисляются слева направо; операторы присваивания оцениваются справа налево.

Так + оценивается left-to-right, где, как операторы присваивания оцененных right to left.

3

Используйте это, если вы хотите 4

int r=1; 
System.out.println((r=2) + r); // execute + is left-to-right 
+1

Ассоциативность + слева направо –

+0

Не могли бы вы объяснить, как он оценивает '4'? Я не мог понять, как он работает. Исходя из моего понимания, я предполагаю, что он будет работать так: '((r = 2) + r) => (2 + r) => (2 + 1) = 3'. Пожалуйста, дополните. Спасибо – John

+0

@John 'r = 2' присваивает 2' r'. Поэтому в следующий раз используется 'r', его значение равно 2. – user3932000

3

Ассоциативность + находится слева-направо, а значение выражения (r=2) является 2.

См JLS 15.7

Левый операнд бинарного оператора, как представляется, в полной мере оценены до какой-либо части правого операнда вычисляется.

Если оператор является оператором составного присваивания (§15.26.2), то оценка левого операнда включает в себя как запоминание переменной, которую левый операнд обозначает, так и выборку и сохранение значения этой переменной для использования в подразумеваемая двоичная операция.

Если оценка левого операнда двоичного оператора завершается внезапно, ни одна часть правого операнда не была оценена.

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) вычисляется перед умножением.

3

это как этого

(r + (r=2)) 
(1 + (r=2)) 
(1 + (2)) 
(3) 
+0

+1 Это правильное объяснение. – NINCOMPOOP

Смежные вопросы