因此,对于在布尔二元运算符,Java有&
,|
,^
,&&
和||
。
让我们在这里简要总结一下他们的工作:
对于
&
,结果值是true
两个操作数都为true
; 否则,结果为false
。对于
|
,结果值是false
两个操作数都为false
; 否则,结果为true
。对于
^
,结果值是true
操作数值是否不同;否则,结果为false
。该
&&
操作是一样&
,但是评估其右边的操作数只有在其左侧的值操作数true
。该
||
操作是一样|
的,但评估其右边的操作数只有在其左侧的值操作数false
。
现在,所有5间,那些3有复合赋值版本,分别为|=
,&=
和^=
。所以我的问题是显而易见的:为什么不是Java提供&&=
和||=
呢?我发现我需要那些比我更需要&=
和|=
。
而且我不认为“因为它太长”是一个很好的答案,因为Java具有>>>=
。一定有一个更好的理由可以忽略这一点。
有12个赋值运算符;[...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
有人评论说,如果&&=
和||=
被实施,那么它将是唯一不首先评估右侧的运营商。我认为,复合赋值运算符首先评估右侧的这一观点是错误的。
形式的复合赋值表达式
E1 op= E2
等效于E1 = (T)((E1) op (E2))
,其中T
是的类型E1
,不同之处在于该表达式E1
仅被评估一次。
为了证明这一点,以下代码段抛出NullPointerException
,而不是ArrayIndexOutOfBoundsException
。
int[] a = null;
int[] b = {};
a[0] += b[-1];