Делать & = и | = короткое замыкание в Java? - PullRequest
32 голосов
/ 30 июня 2010

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

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

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

Ответы [ 2 ]

38 голосов
/ 30 июня 2010

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

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)

Ссылки

4 голосов
/ 30 июня 2010

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

...