Answers:
从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
不平凡,否则两个版本之间的性能差异将太小,不值得考虑。
参见JLS的15.22.2。对于布尔操作数,&
运算符为布尔值,而不是按位。&&
和&
布尔操作数之间的唯一区别是,因为&&
它是短路的(这意味着如果第一个操作数的计算结果为false,则不会计算第二个操作数)。
所以你的情况,如果b
是一种原始的,a = a && b
,a = a & b
,和a &= b
所有做同样的事情。
我遇到了使用布尔值的类似情况,我想避免在a已经为假的情况下调用b()。
这对我有用:
a &= a && b()
a=a&&b()
。