Así que para los operadores binarios en booleanos, Java tiene &
, |
, ^
, &&
y ||
.
Resumamos brevemente lo que hacen aquí:
- JLS 15.22.2 Operadores lógicos booleanos &, ^ y |
- JLS 15.23 Condicional-Y operador &&
- JLS 15.24 Operador O condicional ||
Porque
&
, el valor del resultado estrue
si ambos valores de operando sontrue
; de lo contrario, el resultado esfalse
.Porque
|
, el valor del resultado esfalse
si ambos valores de operando sonfalse
; de lo contrario, el resultado estrue
.Porque
^
, el valor del resultado estrue
si los valores del operando son diferentes; de lo contrario, el resultado esfalse
.El
&&
operador es similar,&
pero evalúa su operando de la derecha solo si el valor de su operando de la izquierda estrue
.El
||
operador es como|
, pero evalúa su operando de la derecha solo si el valor de su operando de la izquierda esfalse
.
Ahora, entre los 5, 3 de ellos tienen versiones de asignación compuesta, a saber |=
, &=
y ^=
. Entonces mi pregunta es obvia: ¿por qué Java no proporciona &&=
y ||=
también? Encuentro que los necesito más de lo que necesito &=
y |=
.
Y no creo que "porque es demasiado largo" sea una buena respuesta, porque Java lo ha hecho >>>=
. Debe haber una mejor razón para esta omisión.
De 15.26 Operadores de asignación :
Hay 12 operadores de asignación; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Se hizo un comentario de que si &&=
y ||=
se llevaron a cabo, entonces sería los únicos operadores que no evalúan el lado derecho primero. Creo que esta noción de que un operador de asignación compuesta evalúa primero el lado derecho es un error.
Desde 15.26.2 Operadores de asignación compuesta :
Una expresión de asignación compuesta de la forma
E1 op= E2
es equivalente aE1 = (T)((E1) op (E2))
, dondeT
es el tipo deE1
, excepto queE1
se evalúa solo una vez.
Como prueba, el siguiente fragmento arroja un NullPointerException
, no un ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];