И = и | = закорачивают в Java?

Другими словами, следующие два оператора ведут себя тот же путь?

isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();

Я понимаю, что мог просто описать тест, но кто-то мог бы знать это бесцеремонно, и другие могли бы найти ответ полезным.

33
задан Justin K 30 June 2010 в 18:25
поделиться

2 ответа

Нет, | = и & = не замыкаются накоротко, потому что они являются версией составного присваивания & и | , которые не замыкаются накоротко.

JLS 15.26.2 Операторы составного присваивания

Выражение составного присваивания в форме E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)) , где T - это тип E1 , за исключением того, что E1 оценивается только один раз.

Таким образом, предполагая логическое & , эквивалентность для isFoobared & = methodWithSideEffects () составляет:

isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit

С другой стороны && и || делают короткое замыкание, но по необъяснимым причинам Java не имеет для них версии составного присваивания. То есть в Java нет ни && = , ни || = .

См. Также


Что это вообще за короткое замыкание?

Разница между логическими логическими операторами ( & и | ) по сравнению с их логическими условными аналогами ( && и || ) заключается в том, что первые не «замыкаются»; последние делают. То есть, при условии отсутствия исключения и т. Д .:

  • & и | всегда вычисляют оба операнда
  • && и || оценивают правый операнд условно ; правый операнд оценивается только в том случае, если его значение может повлиять на результат двоичной операции. Это означает, что правильный операнд НЕ оценивается, когда:
    • Левый операнд && оценивается как ложь
      • (потому что независимо от того, как оценивается правый операнд, все выражение является ложным )
    • левый операнд || оценивается как истина
      • (потому что независимо от того, что оценивается правый операнд, все выражение истинно )

Ссылки

38
ответ дан 27 November 2019 в 18:34
поделиться

Нет, это не так, потому что 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 . В Википедии есть хорошее полное объяснение различных операторов. Теперь, что касается логического значения, я думаю, что вы можете обойтись без использования & и | как не-короткозамыкающих эквивалентов && и || , но я не могу представить, зачем вам это все равно.

4
ответ дан 27 November 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: