Selezionare le istruzioni da eseguire
Selezione singola
Decidere se eseguire o meno una sequenza di istruzioni
if(A > 0) { istr1; istr2; ... }
Decide se eseguire le istruzioni istr1, istr2, …
Se si controlla l’esecuzione di una singola istruzione
if(A > 0) istr1;
Selezione doppia
Decidere quale eseguire tra due diverse sequenze di istruzioni
if(A > 0) { istr11; istr12; ... } else { istr21; istr22; ... }
Decide se eseguire le istruzioni istr11, istr12, … oppure le istruzioni istr21 e istr22, …
Se viene controllata l’esecuzione di singole istruzioni
if(A > 0) istr11; else istr21;
Selezione multipla
Decidere quale sequenza di istruzioni eseguire tra tante sequenze alternative
if(E == E1) { istr11; istr12; ... } else if(E == E2) { istr21; istr22; ... } ... else { istrn1; istrn2; ... }
Decide se eseguire le istruzioni istr11, istr12, … (se E=E1), oppure le istruzioni istr21, istr22, … (se E=E2), oppure … oppure istrn1, istrn2, … (altrimenti).
Tra l’ultimo blocco else if() e l’else finale possono essere inseriti ulteriori blocchi di tipo else if().
L’ultimo blocco else è facoltativo (quindi si può prevedere che nessun blocco sarà eseguito).
Se le espressioni E1, E2, … sono costanti numeriche si può tradurre il tutto in una forma più immediata
switch(E) { case E1: istr11; istr12; ... break; case E2: istr21; istr22; ... break; ... default: istrn1; istrn2; ... break; }
Il blocco default è facoltativo.
Se in un blocco case manca l’istruzione break l’esecuzione continua con il blocco successivo.
Selezioni annidate
Le condizioni perché dei blocchi siano eseguiti a scapito di altri possono essere complicate
if(A > 0) { if(B > 0) { istr11; istr12; ... } else { istr21; istr22; ... } } else { istr31; istr32; ... }
equivale a
if(A > 0 && B > 0) { istr11; istr12; ... } else if(A > 0 && B <= 0) { istr21; istr22; ... } else { istr31; istr32; ... }
Else ciondolante
Un errore frequente che si commette annidando le selezioni è quello dell’else ciondolante
if(A > 0) if(B < 0) // if(A > 0 && B > 0) { istr11; istr12; ... } else // if(A <= 0) ??? { istr21; istr22; ... }
Il compilatore associa l’else al secondo if piuttosto che al primo!
if(A > 0) if(B > 0) // if(A > 0 && B > 0) { istr11; istr12; ... } else // if(A > 0 && B <= 0) { istr21; istr22; ... }
Quindi cambiare l’indentazione non basta per cambiare la valutazione da parte del compilatore!
Se la valutazione voluta è la prima, è necessario aggiungere le parentesi graffe
if(A > 0) { if(B > 0) // if(A > 0 && B > 0) { istr11; istr12; ... } } else // if(A <= 0) { istr21; istr22; ... }