因此对于布尔型上的二进制运算符,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];