Применяется ли оператор Java & = & или &&?



предполагая, что



boolean a = false;


мне было интересно, если это:



a &= b; 


эквивалентно



a = a && b; //logical AND, a is false hence b is not evaluated.


или с другой стороны это означает



a = a & b; //Bitwise AND. Both a and b are evaluated.
522   4  

4 ответов:

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

на стороне производительности, компромисс между стоимостью оценки b, а стоимость теста и ветвь значения a, и потенциальная экономия избежать ненужного назначения на a. Анализ не является прямым, но если стоимость расчета b нетривиально, потенциальная разница в производительности между двумя версиями, вероятно, будет слишком мала, чтобы ее стоило рассматривать.

посмотреть 15.22.2 из JLS. Для логических операндов,& оператор логическое не побитовое. Единственная разница между && и & для логических операндов это то, что для && он закорочен (это означает, что второй операнд не вычисляется, если первый операнд вычисляется как false).

так что в вашем случае, если b примитивный, a = a && b,a = a & b и a &= b все делают одно и то же.

Это:

a = a & b;

я столкнулся с подобной ситуацией, используя булевы, где я хотел избежать вызова b (), если a уже было ложным.

это сработало для меня:

a &= a && b()

Comments

    Ничего не найдено.