Из Спецификации языка 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
является нетривиальной, разница в производительности между двумя версиями слишком мала, чтобы ее стоило учитывать.