2011-01-08 12 views
19

Questa domanda riguarda specificamente gli script di shell, ma potrebbe riguardare qualsiasi linguaggio di programmazione.C'è qualche differenza tra l'utilizzo di più istruzioni if ​​e altro se le istruzioni?

Esiste qualche differenza tra l'utilizzo di più istruzioni if e l'utilizzo delle istruzioni elif negli script di shell? E, una dichiarazione case non funzionerebbe nella mia situazione.

+1

Questo dipende dal layout e dalle interazioni, naturalmente. –

risposta

40

Sì, potenzialmente. Considerate questo (C#, Java, a prescindere):

int x = GetValueFromSomewhere(); 

if (x == 0) 
{ 
    // Something 
    x = 1; 
} 
else if (x == 1) 
{ 
    // Something else... 
} 

vs questo:

int x = GetValueFromSomewhere(); 

if (x == 0) 
{ 
    // Something 
    x = 1; 
} 
if (x == 1) 
{ 
    // Something else... 
} 

Nel primo caso, solo uno di "qualcosa" o "Un'altra cosa ..." si verificherà . Nel secondo caso, gli effetti collaterali del primo blocco rendono vera la condizione nel secondo blocco.

Poi per un altro esempio, le condizioni potrebbero non essere mutuamente esclusive per iniziare con:

int x = ...; 

if (x < 10) 
{ 
    ... 
} 
else if (x < 100) 
{ 
    ... 
} 
else if (x < 1000) 
{ 
    ... 
} 

Se sbarazzarsi della "altro" qui, poi, non appena una condizione ha abbinato, il resto verrà pure.

+1

Ottima risposta, lo accetterò una volta scaduto il tempo limite. Grazie! –

+0

Questo è fantastico! Una spiegazione molto buona. –

7

Ha a che fare con l'efficienza e le vostre esigenze. Se le dichiarazioni vengono eseguite indipendentemente l'una dall'altra. Ognuno correrà. Altrimenti se l'istruzione viene eseguita solo se il precedente se fallisce.

6
if (x == 0) { 
    // 1 
} 


if (x >= 0) { 
    // 2 
} 

if (x <= 0) { 
    // 3 
} 

Sopra il codice produrrà un valore diverso rispetto al codice riportato di seguito per x=0.

if (x == 0) { 
    // 1 
} else if (x >= 0) { 
    // 2 
} else { 
    // 3 
} 

Nel primo caso tutte le dichiarazioni 1, 2 e 3 saranno eseguiti per x = 0. Nel secondo caso saranno solo le dichiarazioni 1.

+0

-1 perché stavo chiedendo "else if", non "else". –

+8

@Mark: il costrutto 'else if' è in realtà un' else' seguito da un 'if':' if (a) {} else if (b) {} 'si compila esattamente come' if (a) { } else {if (b) {}} 'perché il primo è infatti analizzato come quest'ultimo in base alla grammatica della lingua. ('elif' in bash è essenzialmente zucchero sintattico per impedirti di dover aprire più blocchi.) – cdhowie

+0

@ mark-szymanski risposta corretta. Rimuovi il voto se vuoi. – fastcodejava

3

Se si dispone di più istruzioni if, ognuna viene valutata separatamente e, se le condizioni sono corrette, il codice in tutte può essere eseguito. Se si dispone dell'istruzione if/elif, la seconda condizione verrà valutata solo dopo un risultato particolare della valutazione della prima condizione.

considerare questo pseudocodice:

If (cond A) { action 1} 
If (cond B) { action 2} 

Se entrambi cond A e cond B sono vere, entrambe le azioni verranno eseguiti.

D'altra parte, questo pseudocodice:

If (cond A) {action 1} 
Elif (cond B) {action 2} 

Solo uno dei twomactions (o nessuno) sarà eseguita, non importa quanto entrambe le condizioni valutano.

Problemi correlati