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


139

假设

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.

Answers:


146

从Java语言规范-15.26.2复合赋值运算符

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

所以a &= b;等于a = a & b;

(在某些用法中,类型转换对结果有所影响,但在这种b情况下必须如此boolean,而类型转换则不执行任何操作。)

并且,根据记录,a &&= b;无效的Java。没有&&=操作员。


实际上,a = a & b;和之间的语义差异很小a = a && b;。(如果b是变量或常量,则两个版本的结果都将相同。当b子表达式具有副作用时,只有语义上的差异。在这种&情况下,副作用总是会发生。&&是否发生取决于的值a。)

在性能方面,需要在评估b成本,测试成本和价值分支之间进行权衡a,并可能避免避免不必要地分配给a。这种分析并非直截了当,但除非计算成本b不平凡,否则两个版本之间的性能差异将太小,不值得考虑。


您的“实践中”段落具有误导性。使用&over &&的唯一原因是要计算“ b”中的非平凡子表达式
AlexP

澄清。(实际上,琐碎性并没有真正体现出来。)
Stephen C

51

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

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


2
因此,如果b是一个方法调用,(a&= b;)不会短路吗?是否有类似“ && =“运算符的东西?
is7s 2012年

2
看来这并不能回答问题。OP已经知道短路。
OR Mapper 2012年


0

这是一种简单的测试方法:

public class OperatorTest {     
    public static void main(String[] args) {
        boolean a = false;
        a &= b();
    }

    private static boolean b() {
        System.out.println("b() was called");
        return true;
    }
}

输出为b() was called,因此将评估右侧操作数。

因此,正如其他人已经提到的, a &= b与相同a = a & b


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.