假设
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)),whereT的类型.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所有做同样的事情.
| 归档时间: |
|
| 查看次数: |
106559 次 |
| 最近记录: |