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. 

从Java语言规范 – 15.26.2复合赋值操作符 。

E1 op= E2的复合赋值expression式等价于E1 = (T)((E1) op (E2)) ,其中TE1的types,只是E1只计算一次。

所以a &= b; 相当于a = a & b;

(在一些用法中,types转换对结果有所影响,但是在这一个中, b必须是boolean型的,而types转换则什么都不做)。


实际上, a = a & b;之间几乎没有什么区别a = a & b;a = a && b; 。 如果b是一个variables或一个常量,两个版本的结果将是相同的。 b的评价有副作用只有语义上的差异, 即当它是一个不平凡的子expression式。

在性能方面,权衡是在评估b的成本与a的testing和分支的成本之间取舍,并且可能节省避免不必要的分配给a 。 这个分析不是直截了当的,但是除非计算b的代价不是微不足道的,否则两个版本之间潜在的性能差异可能太小而不值得考虑。

见JLS的15.22.2 。 对于布尔操作数, &运算符是布尔值,而不是按位。 布尔操作数的&&&的唯一区别在于&&它是短路的(也就是说,如果第一个操作数的计算结果为false,则不计算第二个操作数)。

所以在你的情况下,如果b是一个原语, a = a && ba = a & ba &= b都会做同样的事情。

这是最后一个:

 a = a & b; 

我遇到了类似的情况,使用布尔值,我想避免调用b()如果a已经是假的。

这对我工作:

 a &= a && b()