Storia della domanda:
L'operatore switch è stato introdotto nel linguaggio C per facilitare la distribuzione del controllo su più rami a seconda del valore di un'espressione. È un'alternativa a una lunga catena di if-else ed è ampiamente utilizzato per la gestione di comandi, stati e valori enumerati.
Problema:
Le principali insidie dell'operatore switch sono legate agli operatori break dimenticati, all'ingresso inatteso nel "fallthrough", alle complessità con le variabili dichiarate all'interno del blocco, e al fatto che il tipo dell'espressione deve essere un intero.
Soluzione:
Per un utilizzo sicuro:
break (o contrassegnare esplicitamente la necessità di fallthrough con commenti);int o compatibili con esso;case nel ramo default;case, oppure nell'area delle {}.Esempio di codice:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Lunedì "); break; case 2: printf("Martedì "); break; case 3: printf("Mercoledì "); break; case 4: printf("Giovedì "); break; case 5: printf("Venerdì "); break; case 6: case 7: printf("Weekend "); break; default: printf("Giorno sconosciuto "); } }
Caratteristiche chiave:
È possibile utilizzare il tipo float nell'espressione switch?
No. Lo standard del linguaggio C richiede che l'espressione nello switch sia intera o convertita in intera (char, short, int, long, enum, ecc.).
Cosa succede se scambio le case di posto — influisce l'ordine sulla logica?
L'ordine delle dichiarazioni dei case nello switch non influisce sulla ricerca del valore corretto. Il codice viene eseguito a partire dal case corrispondente fino al primo break. Ma l'ordine influisce in assenza di break (fallthrough).
È possibile dichiarare variabili all'interno di case senza parentesi graffe?
No. Se si dichiara una variabile dopo il case senza un blocco aggiuntivo {} — questo porterà a un errore di compilazione. Correttamente:
switch (x) { case 1: { int y = 0; break; } }
In un grande progetto, un programmatore ha dimenticato il break dopo uno dei case e ha ottenuto l'esecuzione errata di più rami consecutivamente. Il bug è stato notato solo dall'utente.
Pro:
Contro:
Nel caso in cui il fallthrough fosse necessario, sono stati utilizzati fallthrough commentati con spiegazioni, tutti i case critici erano accompagnati da break o return, e nel default è stato visualizzato un avviso.
Pro:
Contro: