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.

#1 热门回答(122 赞)

来自Java语言规范-15.26.2 Compound Assignment Operators

E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1仅被评估一次。

Soa &= b;相当于a = a & b;

(在某些用法中,类型转换会对结果产生影响,但在这个版本中,b必须是boolean,而类型转换则不做任何事情。)

在实践中,a = a & b;a = a && b;之间几乎没有差别。如果b是变量或常量,则两个版本的结果都相同。当b的评估具有副作用时,只有语义上的差异;即,当它是一个非平凡的子表达式时。

在绩效方面,权衡取决于评估成本b,以及测试和分支价值a的成本,以及避免不必要的分配到a的潜在节省。分析不是直截了当的,但除非计算b的成本非常重要,否则两个版本之间的潜在性能差异可能太小而不值得考虑。


#2 热门回答(38 赞)

see15.22.2 of the JLS。对于布尔操作数,&operator是布尔值,而不是按位。布尔操作数的&&&之间的唯一区别是for&&it被短路(意味着如果第一个操作数的计算结果为false,则不评估第二个操作数)。

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


#3 热门回答(20 赞)

这是最后一个:

a = a & b;