2012-02-18 11 views
11

Eventuali duplicati:
Does java evaluate remaining conditions after boolean result is known
Why do we usually use || not |, what is the difference?Che cos'è un cortocircuito e come viene utilizzato durante la programmazione in Java?

mi mancava la mia classe lezione l'altro giorno e mi chiedevo se qualcuno potesse dare una spiegazione che cosa circuito corto è e forse un esempio di viene utilizzato in un semplice programma Java. Grazie per l'aiuto!

+3

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

risposta

26

Il cortocircuito è dove viene arrestata un'espressione che viene valutata non appena viene determinato il suo risultato. Così, per esempio:

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

Se a == b è vero, allora c == d e e == f sono mai valutati affatto, perché l'esito del espressione è già stato determinato. se a == b è falso, viene valutato c == d; se è true, quindi e == f non viene mai valutato. Questo può non sembrare a fare alcuna differenza, ma prendere in considerazione:

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

If foo() restituisce vero, allora bar e baz sono mai chiamati, perché l'esito del espressione è già stato determinato. Quindi, se bar o baz ha qualche altro effetto oltre a restituire qualcosa (un effetto collaterale ), quegli effetti non si verificano mai.

Un grande esempio di corto circuito si riferisce ad oggetto riferimenti:

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

a.getFoo() normalmente lanciare una NullPointerException se a erano null, ma perché l'espressione cortocircuiti, se a != null è false, la parte a.getFoo() non succede mai, quindi non otteniamo un'eccezione.

Si noti che non tutte le espressioni sono cortocircuitate. Gli operatori || e && sono cortocircuitati, ma | e & non sono, né sono * o /; in effetti la maggior parte degli operatori non lo sono.

2

Short Circuit: Se la prima parte è true non preoccuparsi di valutare il resto dell'espressione. Stessa logica si applica per false nel caso di && che è anche corto circuito

+0

Più precisamente: interrompere la valutazione di un'espressione logica non appena il risultato è certo. – biziclop

+1

Hai appena detto che Java valuta solo la prima parte di un'espressione. – Jeffrey

+0

Perché il downvote? – Cratylus

0

Cortocircuitazione la valutazione di un'espressione significa che solo una parte di espressione deve essere valutata prima di trovare il suo valore. Ad esempio:

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

Se a è null, sottoespressione a.size() == 0 non sarà valutata, perché l'operatore booleano || restituisce true se uno dei suoi operandi è true.

Analogamente, per questa espressione:

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

Se a è null, allora il a.size() > 0 valutazione non sarà, perché l'operatore booleano && restituisce false se uno dei suoi operandi è false.

Negli esempi sopra operatori booleani && e || sono detti essere corto-circuito, dato che il secondo operando non può essere valutato se il valore del primo operando è sufficiente per determinare il valore dell'intera espressione . Per confronto, gli operandi & e | sono equivalenti operatori booleani a corto circuito.

3

Short-circuit evaluation significa che al momento di valutare le espressioni booleane (logica AND e OR) ci si può fermare al più presto a trovare la prima condizione che soddisfa o nega l'espressione.

Per esempio, supponiamo si stava valutando una logica OR con diverse sotto-espressioni, ciascuna delle quali è molto costoso per valutare:

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

La JVM può fermare la valutazione delle funzioni "costlyTest" non appena trova uno che restituisce true, poiché soddisferà l'espressione booleana. Quindi se costlyTest1() restituisce true, gli altri test verranno saltati. Analogamente:

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

La JVM può fermare valutare le funzioni non appena trova uno che restituisce false, dal momento che soddisfa anche l'espressione; quindi se costlyTest1() restituisce false allora le altre funzioni non verranno chiamate.

Queste regole riguardano qualsiasi livello di nidificazione di espressioni booleane e possono essere sfruttate per evitare il lavoro non necessario, come dimostrato negli esempi sopra.

+0

Ah, capisco. E 'stato abbastanza semplice. Grazie per la tua spiegazione veloce e chiara! –

0

corto circuito è un modo alternativo di utilizzare il logiche AND e OR operatori (& o |)

esempio un cortocircuito non OR

if(false | true) { 

} 

La prima condizione e seconda condizione sono entrambi valutati anche se falso non è vero (che è sempre).

Tuttavia è stato scritto come un corto circuito OR:

if(false || true) { 

} 

La prima condizione viene valutata solo dal momento che è falso, vero non viene valutata poiché non è necessario.

Problemi correlati