Ответ 1
Нет, |=
и &=
не замыкаются, потому что они являются составной версией назначения &
и |
, которые не являются короткозамкнутыми.
JLS 15.26.2 Операторы присваивания соединений
Сопряженное присваивание формы
E1 op= E2
эквивалентноE1 = (T)((E1) op (E2))
, гдеT
- типE1
, за исключением того, чтоE1
оценивается только один раз.
Таким образом, считая boolean &
, эквивалентность для isFoobared &= methodWithSideEffects()
равна:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
С другой стороны, &&
и ||
выполняют короткую схему, но необъяснимо, что Java не имеет для них сложной версии назначения. То есть, Java не имеет ни &&=
, ни ||=
.
См. также
- Ярлык "или -назначение" (| =) в Java
- Какая разница между | и || в Java?
- Почему Java не имеет составных версий условных и условных операторов или операторов? (& =, || =)
Что это за короткое замыкание бизнеса?
Разница между логическими операторами boolean
(&
и |
) по сравнению с их условными аналогами boolean
(&&
и ||
) заключается в том, что первые не являются "короткозамкнутыми"; последние делают. То есть, не допуская никаких исключений и т.д.:
-
&
и|
всегда оценивают оба операнда -
&&
и||
оценивать правильный операнд условно; правый операнд оценивается только в том случае, если его значение может повлиять на результат двоичной операции. Это означает, что правый операнд НЕ оценивается, когда:- Левый операнд
&&
оценивается какfalse
- (поскольку независимо от того, что оценивает правильный операнд, все выражение
false
)
- (поскольку независимо от того, что оценивает правильный операнд, все выражение
- Левый операнд
||
оценивается какtrue
- (поскольку независимо от того, что оценивает правильный операнд, все выражение
true
)
- (поскольку независимо от того, что оценивает правильный операнд, все выражение
- Левый операнд