Cortocircuito del operador lógico de Java
¿Qué conjunto está en cortocircuito y qué significa exactamente que la expresión condicional compleja está en cortocircuito?
public static void main(String[] args) {
int x, y, z;
x = 10;
y = 20;
z = 30;
// T T
// T F
// F T
// F F
//SET A
boolean a = (x < z) && (x == x);
boolean b = (x < z) && (x == z);
boolean c = (x == z) && (x < z);
boolean d = (x == z) && (x > z);
//SET B
boolean aa = (x < z) & (x == x);
boolean bb = (x < z) & (x == z);
boolean cc = (x == z) & (x < z);
boolean dd = (x == z) & (x > z);
}
Los operadores &&
y ||
"cortocircuitan", es decir, no evalúan el lado derecho si no es necesario.
Los operadores &
y |
, cuando se utilizan como operadores lógicos, siempre evalúan ambos lados.
Sólo existe un caso de cortocircuito para cada operador y son:
false && ...
- no es necesario saber cuál es el lado derecho porque el resultado sólo puede serfalse
independientemente del valor allítrue || ...
- no es necesario saber cuál es el lado derecho porque el resultado sólo puede sertrue
independientemente del valor allí
Comparemos el comportamiento en un ejemplo simple:
public boolean longerThan(String input, int length) {
return input != null && input.length() > length;
}
public boolean longerThan(String input, int length) {
return input != null & input.length() > length;
}
La segunda versión utiliza el operador sin cortocircuito &
y arrojará un NullPointerException
if input
is null
, pero la primera versión regresará false
sin excepción.
SET A utiliza operadores booleanos de cortocircuito.
Lo que significa "cortocircuito" en el contexto de los operadores booleanos es que para un conjunto de booleanos b1, b2, ..., bn, las versiones de cortocircuito dejarán de evaluarse tan pronto como el primero de estos booleanos sea verdadero (|| ) o falso (&&).
Por ejemplo:
// 2 == 2 will never get evaluated because it is already clear from evaluating
// 1 != 1 that the result will be false.
(1 != 1) && (2 == 2)
// 2 != 2 will never get evaluated because it is already clear from evaluating
// 1 == 1 that the result will be true.
(1 == 1) || (2 != 2)
El cortocircuito significa que el segundo operador no será verificado si el primer operador decide el resultado final.
Por ejemplo, la expresión es: Verdadero || FALSO
En el caso de ||, todo lo que necesitamos es que uno de los lados sea Verdadero. Entonces, si el lado izquierdo es verdadero, no tiene sentido verificar el lado derecho y, por lo tanto, no se verificará en absoluto.
Del mismo modo, Falso y Verdadero
En el caso de &&, necesitamos que ambos lados sean Verdaderos. Entonces, si el lado izquierdo es Falso, no tiene sentido verificar el lado derecho, la respuesta tiene que ser Falso. Y por tanto eso no se comprobará en absoluto.