Приоритет оператора для нескольких скобок в Java - PullRequest
1 голос
/ 13 марта 2020

Например, если бы currNode.left и currNode.right были нулевыми, я бы хотел, чтобы оператор if ломался, прежде чем вычислять дальше, чем currNode.left != null, но следующий оператор if выдает ошибку нулевого указателя, потому что он вычисляет оператор в сначала круглые скобки:

if (currNode.left != null && currNode.right != null && (currNode.left.val == x && currNode.right.val == y) || (currNode.left.val == y && currNode.right.val == x))

, где в качестве дополнительной пары скобок в конце указывается желаемое поведение:

if (currNode.left != null && currNode.right != null && ((currNode.left.val == x && currNode.right.val == y) || (currNode.left.val == y && currNode.right.val == x)))

Я знаю, () вычисляется до &&, но Я не уверен, что здесь происходит.

1 Ответ

1 голос
/ 13 марта 2020

Логическое ИЛИ || имеет более низкий приоритет, чем логическое И &&. Итак:

A && B || C && D

эквивалентно:

(A && B) || (C && D)

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


Подробнее об операторах в Java :


РЕДАКТИРОВАТЬ:

В первом примере:

A && B && (C && D) || (E && F)

это оценивается следующим образом:

= A && B && (C && D) || (E && F)
=   R1   && (C && D) || (E && F) 
=   R1   &&    R2    || (E && F)
=   R1   &&    R2    ||    R3
=        R4          ||    R3
=                    R5

Во втором примере:

A && B && ((C && D) || (E && F))

это оценивается следующим образом:

= A && B && ((C && D) || (E && F))
=   R1   && ((C && D) || (E && F))
=   R1   && (   R2    || (E && F))
=   R1   && (   R2    ||    R3   )
=   R1   &&           R4
=        R5

Обратите внимание, что && и || являются операторами короткого замыкания, что означает, что правый операнд не будет оцениваться, если результат будет получен из вычисления левого операнда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...