Подтвердить что ты не робот

Do & = и | = короткое замыкание в Java?

Другими словами, действуют ли следующие два утверждения одинаково?

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

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

4b9b3361

Ответ 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 не имеет ни &&=, ни ||=.

См. также


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

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

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

Ссылки

Ответ 2

Нет, они этого не делают, потому что x &= y является коротким для x = x & y, а x |= y является коротким для x = x | y. Java не имеет операторов &&= или ||=, которые будут делать то, что вы хотите.

Операторы & и | (вместе с ~, ^, <<, >> и >>>) являются побитовые операторы. Выражение x & y будет для любого целочисленного типа выполнять поразряд и операцию. Аналогично, | выполняет поразрядное или. Чтобы выполнить побитовое действие, каждый бит в числе обрабатывается как логическое, с 1 с указанием true и 0 с указанием false. Таким образом, 3 & 2 == 2, так как 3 есть 0...011 в двоичном формате, а 2 - 0...010. Аналогично, 3 | 2 == 3. Wikipedia имеет полное полное объяснение различных операторов. Теперь, для логического, я думаю, что вы можете избежать использования & и | в качестве эквивалентов без короткого замыкания && и ||, но я не могу себе представить, почему вы хотели бы в любом случае.