Selezioni

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;
   ...
}