Другими словами, следующие два оператора ведут себя тот же путь?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
Я понимаю, что мог просто описать тест, но кто-то мог бы знать это бесцеремонно, и другие могли бы найти ответ полезным.
Нет, | =
и & =
не замыкаются накоротко, потому что они являются версией составного присваивания &
и |
, которые не замыкаются накоротко.
JLS 15.26.2 Операторы составного присваивания
Выражение составного присваивания в форме
E1 op = E2
эквивалентноE1 = (T) ((E1) op (E2))
, гдеT
- это типE1
, за исключением того, чтоE1
оценивается только один раз.
Таким образом, предполагая логическое &
, эквивалентность для isFoobared & = methodWithSideEffects ()
составляет:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
С другой стороны &&
и ||
делают короткое замыкание, но по необъяснимым причинам Java не имеет для них версии составного присваивания. То есть в Java нет ни && =
, ни || =
.
Разница между логическими
логическими операторами ( &
и |
) по сравнению с их логическими
условными аналогами ( &&
и ||
) заключается в том, что первые не «замыкаются»; последние делают. То есть, при условии отсутствия исключения и т. Д .:
&
и |
всегда вычисляют оба операнда &&
и ||
оценивают правый операнд условно ; правый операнд оценивается только в том случае, если его значение может повлиять на результат двоичной операции. Это означает, что правильный операнд НЕ оценивается, когда:
&&
оценивается как ложь
ложным
) ||
оценивается как истина
истинно
) Нет, это не так, потому что x & = y
является сокращением от x = x & y
и x | = y
- это сокращение от x = x | y
. В Java нет операторов && =
или || =
, которые делали бы то, что вы хотите.
Операторы &
и |
(вместе с ~
, ^
, <<
, ] >>
и >>>
) - это побитовые операторы . Выражение x & y
для любого целочисленного типа будет выполнять побитовое и операцию. Точно так же |
выполняет побитовое или. Для выполнения побитовой операции каждый бит числа обрабатывается как логическое, где 1
указывает истина
, а 0
указывает ложь
. Таким образом, 3 & 2 == 2
, поскольку 3
равно 0 ...011
в двоичном формате и 2
равно 0 ... 010
. Аналогично 3 | 2 == 3
. В Википедии есть хорошее полное объяснение различных операторов. Теперь, что касается логического значения, я думаю, что вы можете обойтись без использования &
и |
как не-короткозамыкающих эквивалентов &&
и ||
, но я не могу представить, зачем вам это все равно.