____________________________________
/ switch (Muu) \
| { |
| case 0: |
| printf("Muu!\n"); |
| break; |
| case 1: |
| printf("Muuu!\n"); |
| break; |
| default: |
| printf("Muuuuuuuuuuuuuuu!\n"); |
| break; |
\ } /
------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Lo switch si utilizza in alternativa all’if ... else if ... else ... soprattutto quando ci si trova a valutare una variabile numerica intera (quindi un int o long ma anche un char, che come sappiamo si possono considerare a tutti gli effetti delle variabili numeriche, ma non è possibile usare un float o una stringa).
Si preferisce lo switch soprattutto quando il numero di condizioni da verificare molte (indicativamente quattro o più), oppure si prevede di aggiungere al codice un numero di condizioni non ancora ben definito, questo per migliorare la leggibilità del codice e le performance, ma si usa lo switch nel caso si voglia sfruttare alcune peculiarità della sua sintassi.
void HowManyHaveYouGained(int gain)
{
switch (gain)
{
case 0:
printf("I have gained nothing\n");
break;
case 1:
printf("I have gained only one €\n");
break;
default:
printf("I have gained %d €\n",gain);
break;
}
return;
}
Nella funzione HowManyHaveYouGained viene stampato un messaggio diverso a seconda del valore passato come parametro. La sintassi prevede quindi la presenza del costrutto switch e tra parentesi graffe l’elenco delle azioni da compiere quando la variabile indicata nello switch assume il valore del corrispondente case: la parola chiave break è in questo caso necessaria e indica la fine del blocco di comandi relativi al case. Con default si indica la parte di codice da eseguire nel caso nessuna delle precedenti condizioni è verificato (con un’importante eccezione che andiamo tra poco a chiarire).
In realtà il break all’interno del case può essere omesso nel caso lo switch venga usato per eseguire più azioni in cascata. Un esempio chiarità il modo con cui funziona questo costrutto:
// 0 == Domenica, 1 == Lunedì, 2 == Martedì, ecc..
// 5 == Venerdì, 6 == Sabato
void DailyMenu (int dayofweek)
{
*menu='\0';
switch (dayofweek)
{
case 0:
strcat(menu,"Oggi la mensa è chiusa\n");
break;
case 6:
strcat(menu,"Dolce della casa\n");
case 1:
case 2:
case 3:
case 4:
strcat(menu,"Pasta al sugo\n");
strcat(menu,"Carne panata\n");
break;
case 5:
strcat(menu,"Gnocchi al pesto\n");
strcat(menu,"Filetto di merluzzo\n");
}
return;
}
Questa funzione valorizza il menù del giorno in funzione del giorno della settimana: la domenica la mensa è chiusa, viene inserito un messaggio e il break conduce al termine del blocco. Il sabato viene aggiunto il dolce, subito dopo la valorizzazione si nota l’assenza del break: vengono considerati veri tutti i case successivi fino al break, ovvero risulta lo stesso menù del lunedì, martedì, mercoledì e giovedì. Al termine di questo blocco è presente il break, che permette di gestire il caso particolare del venerdì.
| input: dayofweek | output: menu |
|---|---|
| 0 | Oggi la mensa è chiusa |
| 1, 2, 3, 4 | Pasta al sugo |
| 5 | Gnocchi al pesto |
| 6 | Dolce della casa |
Quindi giungere al break comporta uscire dal blocco switch, l’assenza del break produce l’esecuzione del codice relativo al case successivo e a cascata tutti gli altri case fino al primo break o al termine del blocco switch. Ovviamente nell’ultimo case il break si può omettere, ma è una pratica sconsigliata dal momento che può facilitare la creazione di bug nel codice; infatti nel caso si decidesse di aggiungere un blocco alla fine si potrebbe dimenticare di chiudere il precedente con il break. Anche il blocco relativo al default è opzionale, viene posto tipicamente al termine delle altre condizioni, ma in realtà può inserito in qualunque posizione, e tenendo conto dell’esecuzione a cascata delle condizioni tale possibilità potrebbe essere utilmente utilizzata.
Infine sottolineiamo che è buona prassi racchiudere i blocchi del case in parentesi graffe ed aiutarsi con l’indentazione per meglio evidenziare la struttura del codice, migliorandone la leggibilità.
void HowManyHaveYouGained(int gain)
{
switch (gain) {
case 0:
{
printf("I have gained nothing\n");
break;
}
case 1:
{
printf("I have gained only one €\n");
break;
}
default:
{
printf("I have gained %d €\n", gain);
break;
}
}
return;
}