Nella programmazione, come già detto, le istruzioni vengono eseguite dalla prima fino all'ultima. Per deviare il flusso delle scelte (ad esempio per scegliere tra l'opzione A e l'opzione B) basta porre delle condizioni che, se verificate, eseguono un pezzo di codice o altrimenti ne eseguono un altro; queste istruzioni particolari che permettono di incanalare il flusso si chiamano strutture di controllo condizionale o, più genericamente, istruzioni condizionali. Nel linguaggio di programmazione C, esistono due tipi di strutture di controllo condizionale, l'if-else e lo switch. L'if-else e lo switch hanno, sostanzialmente, comportamenti simili, ed anche se il primo è largamente il più usato, hanno delle differenze per quanto riguarda il tipo di operazione che vogliamo svolgere; ma vediamo nel dettaglio come funzionano.
Nota: in C, a differenza del C++ e del Java, non esiste il tipo booleano (che può assumere valore vero -true- o falso -false-), per questo quando deve essere verificata una condizione essa risulta falsa se vale zero e vera altrimenti.
If-Else in C
L'istruzione if permette di verificare determinate condizioni ed ha la seguente sintassi:
[... altre istruzioni ...]
if (espressione)
istruzione
[... altre istruzioni ...]
In questo caso se l'espressione risulta vera, fa eseguire l'istruzione immediatamente successiva, altrimenti (se la condizione è falsa) si salta l'istruzione (od il blocco di istruzioni) facenti parti dell'if e si procede nell'esecuzione delle istruzioni successive, che possono essere la prosecuzione del programma o un semplice else, ad indicare la possibile alternativa all'if:
if (espressione)
istruzione1
else
istruzione2
o un else if che permette di verificare una o più condizioni:
if (espressione)
istruzione1
else if (espressione)
istruzione2
else
istruzione3
Così si può comandare il flusso del programma decidendo di eseguire una parte di codice oppure no (nel caso del solo if), di fare una scelta tra due parti di codice (nel caso if - else) o di fare una scelta tra più parti di codice (nel caso if - else if - else).
Facciamo un esempio pratico nel codice sottostante, assumendo che sia stato definito, nel codice soprastante all'if, il valore della variabile intera "risultato_esame", che può assumere un valore compreso tra 0 e 30:
if (risultato_esame >=18)
printf ("Complimenti hai superato l'esame");
else if (risultato_esame >=15)
printf ("Devi sostenere l'orale per questo esame");
else
printf ("Non hai superato l'esame");
Generalmente dopo un if o un else viene eseguita solo la prima istruzione più vicina, regola che può creare dei problemi quando ci sono due o più istruzioni, ma alla quale si può porre rimedio ponendo tutte le istruzioni tra due parentesi graffe, la graffa di apertura ( { ) andrà sotto all'if, allineata con la prima lettera, mentre la graffa di chiusura ( } ) andrà posta dopo l'ultima istruzione, su una nuova riga ed allineata con quella di apertura. Per chiarire meglio, ecco un if-else abbastanza semplice che spiega come utilizzare le parentesi graffe per raccogliere istruzioni:
if (risultato_esame >=18)
{
printf ("Complimenti hai superato l'esame");
int passato = 1;
} else {
printf ("Non hai superato l'esame");
int passato = 0;
}
Dobbiamo fare particolare attenzione all'uso dei blocchi if annidati, come quello dell'esempio:
if (risultato_esame < 18)
if (risultato_esame < 15) printf ("Non hai superato l'esame");
else printf ("Sei stato ammesso all'orale");
In questo caso risulta difficile capire esattamente quale sia il significato reale di questo else, e soprattutto ci si potrebbe domandare se realmente il programmatore abbia voluto porre determinate condizioni o se abbia semplicemente sbagliato a strutturare il costrutto if. Se non capiamo esattamente il codice, conviene ricordarsi la regola secondo la quale "l'else si riferisce sempre all'if più vicino, a meno che non sia diversamente specificato da eventuali parentesi graffe", ma è comunque buona norma usare sempre le parentesi graffe anche quando si tratta di eseguire una sola istruzione, magari indentando (mettendo opportune spaziature) correttamente il codice. L'esempio precedente risulta sicuramente più chiaro se strutturato in questo modo:
if (risultato_esame < 18)
{
if (risultato_esame < 15)
{
printf ("Non hai superato l'esame");
} else {
printf ("Sei stato ammesso all'orale");
}
}