2014-09-26 19 views
7

Quando sarà necessario utilizzare l'operatore logico senza cortocircuito o? In altre parole ...Operatore logico O senza cortocircuito

Quando volete utilizzare

if(x == 1 | x==2) 

Invece di

if(x == 1 || x==2) 

Se il primo condizionale è vero ... Poi l'intera istruzione è già vero.

Update: e la stessa domanda per & e & &

+0

Vuoi sapere questo "per i tipi booleani"? Per i tipi interi, l'operatore logico o logico è molto utile in sé, ma l'operazione di cortocircuito non è un'alternativa poiché non funziona su tipi interi. –

+0

Vedere la risposta qui: http://stackoverflow.com/questions/9264897/reason-for-the-exsistance-of-non-short-circuit-logical-operators – Halogen

risposta

8

Un esempio nasce se abbiamo due funzioni e vogliamo entrambi da eseguire:

if (foo() | bar()) 

Se avessimo usato ||, poi bar() non verrà eseguito se foo() restituisce true, che potrebbe non essere quello che vogliamo. (. Anche se questo è un po 'di un caso oscuro, e spesso non ||è la scelta più appropriata)

Una situazione analoga può venire con &/&&:

if (foo() & bar()) 

Se avessimo usato &&, allora bar() non verrà eseguito se foo() restituisce false, che di nuovo potrebbe non essere quello che vogliamo.

+0

e anche quando si ha if (x == 1 | x ++ > 2) ... –

+0

@shinjw Risposta aggiornata. – arshajii

4

Bene, ci sono alcuni motivi. Prendiamo il seguente esempio:

if(someImportantMethod() | otherImportantMethod()) 
{ 
    doSomething(); 
} 

Se avete bisogno di entrambi i metodi per essere eseguito, a prescindere dal risultato dell'altro metodo, allora dovreste usare | invece di ||.

Qualcosa da notare è che gli operandi di corto circuito sono leggermente più lenti (anche se l'impatto sulle prestazioni è solitamente impercettibile).

2

Secondo la tua domanda,

se si utilizza "|" operatore come "if (x == 1 | x == 2)", entrambe le espressioni sono valutate e se esiste almeno un valore TRUE, eseguire il corpo del blocco if

se si utilizza "||" operatore come "if (x == 1 || x == 2)", la prima espressione viene valutata e se viene restituita TRUE allora non valuterà la seconda espressione ed eseguirà il corpo del blocco if

se si utilizza operatore "&" come "if (x == 1 & x == 2)", entrambe le espressioni vengono valutate e se entrambe le espressioni sono restituire valore TRUE quindi eseguire il corpo del blocco if

se si utilizza "& & "operatore come" if (x == 1 & & x == 2) ", viene valutata la prima espressione e se restituisce FALSE quindi non passa alla valutazione della seconda espressione e NON esegue il corpo del blocco if

Inoltre, "||" e "& &" può essere utilizzato per risparmiare il tempo delle operazioni della vostra applicazione

1

ho chiesto Josh Bloch se stesso questa domanda una volta e lui ha dato un altro possibile motivo, IIRC: prestazioni. La versione non in corto circuito non ha diramazioni. Se il secondo operando è molto economico e il primo è quasi sempre vero, potrebbe essere più rapido evitare la valutazione condizionale del secondo e lasciare che il processore lo esegua senza attendere.