2012-04-15 37 views
11

Ambos operadores condicionales & & y || están en cortocircuito según
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html, lo que significa que el segundo operando no necesita ser evaluado a veces.comportamiento de cortocircuito del operador O condicional (||)

¿Podría alguien proporcionar un ejemplo en el que el operador condicional O (||) se cortocircuitaría?

comportamiento de corto-circuito es bastante sencillo con el operador condicional-Y (& &) como en:

si (falso & & (1> 0)), entonces el segundo operando: (1> 0) no necesitaría ser evaluado, pero parece que no puede encontrar/pensar en un ejemplo para O condicional.

+1

El cortocircuito ocurrirá cuando el resultado del primer operando pueda definir el resultado de la operación lógica. Para '&&' el primer devenir 'false' hará que el resultado sea' false' definitivamente y para '||' el primero que se haga verdadero hará definitivamente 'verdadero' el resultado. Entonces, el primer operando que sea 'verdadero' cortará siempre el circuito para el operador '||'. –

+1

¿Por qué es menos sencillo con ||? Es exactamente tan sencillo como con &&. El cálculo de expresiones se detiene cuando se conoce el valor de la condición completa. Las expresiones se evalúan de izquierda a derecha. –

+0

@ MichaelSchmeißer: lo siento, no sé cómo me lo perdí siendo sencillo. – Vivek

Respuesta

1
if(true || (0 > 1)) 

La primera afirmación es verdadera, por lo que no es necesario evaluar la segunda.

15

El operador or se cortocircuita cuando el primer operando es verdadero. Por lo tanto,

String foo = null; 
if (true || foo.equals("")) { 
    // ... 
} 

no arroja un NullPointerException.

Como señala correctamente @prajeesh en los comentarios, en la forma en que se usa un cortocircuito en el código real es para evitar un NullPointerException siempre que se trate de una API que podría devolver nulo. Así, por ejemplo, si hay un método que devuelve readStringFromConsole o bien la cadena disponibles actualmente o nulo si el usuario no escribe nada, podríamos escribir

String username = readStringFromConsole(); 
while (username == null || username.length() == 0) { 
    // No NullPointerException on the while clause because the length() call 
    // will only be made if username is not null 

    System.out.println("Please enter a non-blank name"); 
    username = readStringFromConsole(); 
} 

// Now do something useful with username, which is non-null and of nonzero length 

Como nota al margen, una API que devuelve la entrada del usuario debe devolver la cadena vacía siempre que el usuario no escriba nada, y no debe devolver nulo. La devolución nula es una forma de decir "no hay nada disponible", mientras que devolver la cadena vacía es una forma de decir "el usuario no escribió nada", por lo que es preferible.

+1

No encontré una situación en la que este 'verdadero verdadero || || foo.equals ("") 'hace que las cosas se vean sensiblemente lógicas, debería ser' if (foo == null || foo.equals ("")) 'que cortará brevemente cuando' foo' sea nulo y así evitará el NPE . –

1
if (true || comparison) 

comparación nunca será evaluado, ya que su resultado es irrelevante (porque el primer argumento ya es cierto).

Cuestiones relacionadas