Cortocircuito del operador lógico de Java

Resuelto Aaron asked hace 12 años • 10 respuestas

¿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);

}
Aaron avatar Jan 06 '12 22:01 Aaron
Aceptado

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 ser falseindependientemente del valor allí
  • true || ...- no es necesario saber cuál es el lado derecho porque el resultado sólo puede ser trueindependientemente 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 NullPointerExceptionif inputis null, pero la primera versión regresará falsesin excepción.

Bohemian avatar Jan 06 '2012 15:01 Bohemian

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)
afrischke avatar Jan 06 '2012 15:01 afrischke

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.

Bhushan avatar Jan 06 '2012 15:01 Bhushan