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 estruesi ambos valores de operando sontrue; de lo contrario, el resultado esfalse.Porque
|, el valor del resultado esfalsesi ambos valores de operando sonfalse; de lo contrario, el resultado estrue.Porque
^, el valor del resultado estruesi 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= E2es equivalente aE1 = (T)((E1) op (E2)), dondeTes el tipo deE1, excepto queE1se 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];