2013-05-17 17 views
21

Okay, quindi ho testato questo pezzo di codice e ho scoperto che non vi è alcuna eccezione buttata fuori.Due condizioni in una istruzione if se la seconda importa se la prima è falsa?

public static void main(String[] args) { 
    int[] list = {1,2}; 
    if (list.length>2 && list[3] == 2){ 
     System.out.println(list[1]); 
    } 
} 

fa la dichiarazione qui

if (list.length>2 && list[3] == 2) 

significare che se la prima condizione è falsa che non hanno nemmeno bisogno di controllare la seconda condizione?

O uguale a

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

?

E, cosa succede se è scritto in C o Python o in altre lingue?

Grazie

+1

i tuoi 2 modi sono equivalenti –

+2

Java segue http://en.wikipedia.org/wiki/Short-circuit_evaluation (valutazione di cortocircuito) per convalidare quell'espressione – Vasu

+1

La valutazione di cortocircuito ti consente di valutare le condizioni che saranno legali solo a lungo come la prima condizione è legale. Vedrete spesso codice come 'if (string! = Null && string.length> 5)' –

risposta

39

E 'comune per le lingue (Java e Python sono tra loro) per valutare il primo argomento di una logica AND e finire la valutazione della dichiarazione, se il primo argomento è false. Questo perché:

Da The Order of Evaluation of Logic Operators,

Quando Java valuta l'espressione d = b & & c ;, esso controlla prima se b è vero.Qui b è falso, quindi b & & c deve essere falso indipendentemente dal fatto che c sia o non sia vero, quindi Java non si preoccupa di controllare il valore di c.

Questo è noto come short-circuit evaluation ed è indicato anche nello Java docs.

È comune vedere list.count > 0 && list[0] == "Something" controllare un elemento di elenco, se esiste.


E 'anche opportuno ricordare che if (list.length>2 && list[3] == 2) è non uguale al secondo caso

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

se c'è un else dopo. else si applica solo all'istruzione if a cui è collegata.

per dimostrare questo Gotcha:

if (x.kind.equals("Human")) { 
    if (x.name.equals("Jordan")) { 
     System.out.println("Hello Jordan!"); 
    } 
} else { 
    System.out.println("You are not a human!"); 
} 

funzionerà come previsto, ma

if (x.kind.equals("Human") && x.name.equals("Jordan")) { 
    System.out.println("Hello Jordan!"); 
} else { 
    System.out.println("You are not a human!"); 
} 

sarà anche dire alcuna Umano che non è Jordan non sono umani.

+1

L'ultimo blocco è giusto. Solo 'Jordan's può eseguire il mondo. – TheBrenny

+0

Operatori bitwise di Python ('&', '|') ** non ** supportano il cortocircuito. Tuttavia i seguenti operatori di Python ** fanno **: 'and',' or', 'any',' all' – anilbey

14

Sì. Se la prima condizione non è soddisfatta, il resto non viene valutato. Questo è noto come da cortocircuito. Vedi here per maggiori dettagli. Nota che questo non è particolare per Java e molte altre lingue faranno lo stesso.

4

Sì, entrambi gli usi sono semanticamente equivalenti ... Cioè, a meno che la lunghezza sia> 2, il codice è autorizzato ad accedere a più del 2 ° elemento.

Nel primo caso, ciò che conta è l'operatore &&, pensare ad esso come: Se la prima condizione è vera allora applicare seconda condizione.

La condizione successiva ha anche un implicito "quindi" clausola

if length greater than two 
then access third element 
6

Fin dal javadoc:

Gli operatori condizionali

Il & & e || gli operatori eseguono operazioni Conditional-AND e Conditional-OR su due espressioni booleane. Questi operatori presentano il comportamento di "cortocircuito" , il che significa che il secondo operando è valutato solo se necessario.

& & Conditional-AND || Conditional-O

3

Se la prima condizione è falsa, allora non ci vorrà verificare la presenza di seconda condizione come qualcosa & & F = F ancora una volta dipende che morse saggia operazione che si sta facendo. come in caso di OR (||) se la prima condizione è vera (T), non controllerà la seconda condizione come qualcosa || T = T, ma se è falso (F), verificherà definitivamente il secondo

3

Nella dichiarazione IF è stato specificato che entrambe le condizioni devono essere vere per l'esecuzione di System.out.println. Quindi, se la prima condizione fallisce, la seconda condizione non viene controllata (questo è per l'operatore AND). Ma la seconda condizione sarà rallegrata se hai specificato l'operatore OR nella dichiarazione If.

Problemi correlati