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))
,其中T
是E1
的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 && b
, a = a & b
和a &= b
都会做同样的事情。
这是最后一个:
a = a & b;
我遇到了类似的情况,使用布尔值,我想避免调用b()如果a已经是假的。
这对我工作:
a &= a && b()