2012-02-18 17 views
11

Duplicar posible:
Does java evaluate remaining conditions after boolean result is known
Why do we usually use || not |, what is the difference?¿Qué es el cortocircuito y cómo se usa cuando se programa en Java?

me perdió mi conferencia clase el otro día y me preguntaba si alguien podría dar una explicación lo cortocircuitos es y tal vez un ejemplo de se usa en un simple programa de Java. ¡Gracias por tu ayuda!

+3

http://en.wikipedia.org/wiki/Short-circuit_evaluation – Matt

Respuesta

26

En cortocircuito es donde se deja de evaluar una expresión tan pronto como se determina su resultado. Así, por ejemplo:

if (a == b || c == d || e == f) { 
    // Do something 
} 

Si a == b es cierto, entonces c == d y e == f son no se evaluaron en absoluto, porque el resultado de la expresión ya ha sido determinada. si a == b es falso, entonces se evalúa c == d; si es verdadero, entonces e == f nunca se evalúa. Esto puede no parecer para hacer alguna diferencia, pero tenga en cuenta:

if (foo() || bar() || baz()) { 
    // Do something 
} 

If foo() vuelve verdad, entonces bar y baz están nunca llamó, porque el resultado de la expresión ya ha sido determinada. Por lo tanto, si bar o baz tiene algún otro efecto que simplemente devolver algo (un efecto secundario ), esos efectos nunca ocurren.

Un gran ejemplo de un cortocircuito se relaciona con referencias a objetos:

if (a != null && a.getFoo() != 42) { 
    // Do something 
} 

a.getFoo() normalmente lanzar una NullPointerException si a eran null, pero debido a la expresión cortocircuitos, si a != null es false, la parte a.getFoo() nunca sucede, entonces no obtenemos una excepción.

Tenga en cuenta que no todas las expresiones están en cortocircuito. Los operadores || y && están en cortocircuito, pero | y & no son ni son * ni /; de hecho, la mayoría de los operadores no lo son.

2

Short Circuit: Si la primera parte es true no se moleste en evaluar el resto de la expresión. Se aplica la misma lógica para false en el caso de && que también está cortocircuitando

+0

Más precisamente: deje de evaluar una expresión lógica tan pronto como el resultado sea cierto. – biziclop

+1

Acabas de decir que Java solo evalúa la primera parte de una expresión. – Jeffrey

+0

¿Por qué el voto a favor? – Cratylus

0

El cortocircuito en la evaluación de una expresión significa que solo una parte de la expresión debe evaluarse antes de encontrar su valor. Por ejemplo:

a == null || a.size() == 0 

Si a es null, la a.size() == 0 subexpresión no será evaluado, ya que el operador booleano || evalúa a true si uno de sus operandos es true.

Del mismo modo, para esta expresión:

a != null && a.size() > 0 

Si a es null, entonces el a.size() > 0 no serán evaluados, debido a que el operador booleano && evalúa a false si uno de sus operandos es false.

En los ejemplos anteriores los operadores booleanos && y || se dice que son cortocircuito, dado el hecho de que el segundo operando no podría ser evaluado si el valor del primer operando es suficiente para determinar el valor de toda la expresión . A modo de comparación, los operandos & y | son los operadores booleanos no de cortocircuito equivalentes.

3

Short-circuit evaluation significa que al evaluar expresiones booleanas (lógicas AND y) puede detenerse tan pronto como encuentre la primera condición que satisfaga o anule la expresión.

Por ejemplo, supongamos que se estaban evaluando una lógica OR con varios sub-expresiones, cada una de las cuales es muy costoso para evaluar:

if (costlyTest1() || costlyTest2() || costlyTest3()) { // ... 

La JVM puede dejar de evaluar las funciones de "costlyTest" tan pronto como se encuentra uno que devuelve true, ya que eso satisfará la expresión booleana. Por lo tanto, si costlyTest1() devuelve verdadero, las otras pruebas se omitirán. Del mismo modo:

if (costlyTest1() && costlyTest2() && costlyTest3()) { // ... 

La JVM puede dejar de evaluar las funciones tan pronto como se encuentra uno que devuelve false, ya que también satisface la expresión; entonces, si costlyTest1() devuelve falso, las otras funciones no serán llamadas.

Estas reglas pertenecen a cualquier nivel de anidación de expresiones booleanas y se pueden aprovechar para evitar trabajos innecesarios, como se demuestra en los ejemplos anteriores.

+0

Ah, ya veo. Eso fue bastante simple. ¡Gracias por tu explicación rápida y clara! –

0

corto circuito es una forma alternativa de utilizar la lógica AND u OR operadores (& o |)

por ejemplo un no cortocircuito o

if(false | true) { 

} 

La primera condición y la segunda condición se evaluaron tanto incluso si es falso no es verdad (que siempre es).

Sin embargo, se fue escrito como un cortocircuito OR:

if(false || true) { 

} 

La primera condición sólo se evalúa ya que es falso, la verdadera no se evalúa, ya que no es necesario.

Cuestiones relacionadas