因此对于布尔型上的二进制运算符,Java 有 &、 |、 ^、 &&和 ||。
让我们来总结一下他们在这里做了什么:
对于
&,如果两个操作数值都是true,则结果值为true; 否则,结果为false。对于
|,如果两个操作数值都是false,则结果值为false; 否则,结果为true。对于
^,如果操作数值不同,则结果值为true; 否则,结果为false。
&&操作符类似于&,但只有当其左操作数的值为true时才计算其右操作数。
||操作符类似于|,但只有当其左操作数的值为false时才计算其右操作数。
现在,在所有这5个中,有3个有复合赋值版本,即 |=、 &=和 ^=。所以我的问题很明显: 为什么 Java 不提供 &&=和 ||=呢?我发现我需要这些超过我需要 &=和 |=。
我不认为“因为它太长”是个好答案,因为 Java 有 >>>=。这种疏忽肯定有更好的理由。
来自 15.26指派营办商:
有12个赋值运算符; [ ... ]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
有人评论说,如果实现了 &&=和 ||=,那么它将是唯一不首先计算右边的操作符。我认为复合赋值操作符首先计算右边的概念是错误的。
来自 15.26.2复合式指配营办商:
E1 op= E2形式的复合赋值表达式等价于E1 = (T)((E1) op (E2)),其中T是E1的类型,除了E1只计算一次。
作为证明,下面的代码片段抛出的是 NullPointerException,而不是 ArrayIndexOutOfBoundsException。
int[] a = null;
int[] b = {};
a[0] += b[-1];