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все делают одно и то же.
я столкнулся с подобной ситуацией, используя булевы, где я хотел избежать вызова b (), если a уже было ложным.
это сработало для меня:
a &= a && b()
Comments