Java&=运算符是否适用&或&&?

pak*_*ore 130 java operators

假设

boolean a = false;
Run Code Online (Sandbox Code Playgroud)

我想知道是否这样做:

a &= b; 
Run Code Online (Sandbox Code Playgroud)

相当于

a = a && b; //logical AND, a is false hence b is not evaluated.
Run Code Online (Sandbox Code Playgroud)

或者另一方面它意味着

a = a & b; //Bitwise AND. Both a and b are evaluated.
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 138

来自Java语言规范 - 15.26.2复合赋值运算符.

除了仅计算一次之外,表单的复合赋值表达式E1 op= E2等效于E1 = (T)((E1) op (E2)),where T的类型.E1E1

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

(在某些用法中,类型转换,使该结果的差异,但在这一个b必须是boolean和类型,投什么都不做.)

并且,对于记录,a &&= b;是无效的Java.没有&&=操作员.


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

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


ste*_*tew 49

JLS的15.22.2.对于布尔操作数,&运算符是布尔值,而不是按位.布尔操作数&&&布尔操作数之间的唯一区别是&&它被短路(意味着如果第一个操作数的计算结果为false,则不会计算第二个操作数).

所以你的情况,如果b是一种原始的,a = a && b,a = a & b,和a &= b所有做同样的事情.

  • 正确.调用b().没有&& =运算符. (3认同)
  • 所以如果b是方法调用,(a&= b;)不会短路?有什么像"&& ="运算符? (2认同)
  • 这似乎没有回答这个问题; OP已经知道短路了. (2认同)

Phi*_*ert 20

这是最后一个:

a = a & b;
Run Code Online (Sandbox Code Playgroud)