Из Спецификации языка Java - 15.26.2 Операторы составного присваивания .
Составное выражение присваивания формы E1 op= E2
эквивалентно E1 = (T)((E1) op (E2))
, где T
- тип E1
, за исключением того, что E1
оно оценивается только один раз.
Так a &= b;
эквивалентно a = a & b;
.
(В некоторых случаях приведение типов имеет значение для результата, но в этом b
случае boolean
приведение типов должно быть таким, и приведение типов ничего не делает.)
И, к сведению, a &&= b;
недопустима Java. Нет &&=
оператора.
На практике существует небольшая семантическая разница между a = a & b;
и a = a && b;
. (Если b
это переменная или константа, результат будет одинаковым для обеих версий. Семантическая разница существует только в b
том &
случае, если подвыражение имеет побочные эффекты. В этом случае побочный эффект возникает всегда. &&
случается в зависимости от значения a
.)
Что касается производительности, компромисс между стоимостью оценки b
и стоимостью теста и перехода значения a
, а также потенциальной экономией за счет избежания ненужного присвоения a
. Анализ не является прямым, но если стоимость вычислений не b
является нетривиальной, разница в производительности между двумя версиями слишком мала, чтобы ее стоило учитывать.
см. 15.22.2 JLS . Для булевых операндов
&
оператор является логическим, а не побитовым. Единственная разница между логическими операндами&&
и&
для них заключается в том, что&&
они закорочены (это означает, что второй операнд не оценивается, если первый операнд принимает значение false).Так что в вашем случае, если
b
это примитивно,a = a && b
,a = a & b
иa &= b
все делают то же самое.источник
Это последний:
источник
Вот простой способ проверить это:
public class OperatorTest { public static void main(String[] args) { boolean a = false; a &= b(); } private static boolean b() { System.out.println("b() was called"); return true; } }
Выходной сигнал равен
b() was called
, поэтому оценивается правый операнд.Итак, как уже упоминалось другими,
a &= b
это то же самое, что иa = a & b
.источник
Я столкнулся с аналогичной ситуацией с использованием логических значений, когда я хотел избежать вызова b (), если a уже было ложным.
Это сработало для меня:
источник
a=a&&b()
.