Sin dall'inizio, nel linguaggio C, è stato consentito omettere le parentesi graffe per un singolo statement all'interno della costruzione if. Questo ha reso il codice più compatto, ma ha provocato numerosi errori non evidenti, specialmente durante l'espansione e la modifica. La ragione storica è il risparmio di spazio e la semplicità della sintassi per casi minimalisti.
Il problema si presenta quando lo sviluppatore dimentica che senza parentesi if controlla solo il primo statement dopo di esso: tutti i successivi vengono eseguiti incondizionatamente, anche se visivamente potrebbe non sembrare ovvio. Questo stile porta a bug nascosti che sono difficili da identificare quando si legge il codice e a errori derivanti da indentazioni dimenticate o dall'aggiunta di nuove righe.
La soluzione è utilizzare sempre le parentesi graffe, anche se c'è solo un'istruzione. Questo aumenta la leggibilità e la sicurezza del codice.
Esempio di codice:
// Male: if (x > 0) do_something(); do_other(); // Eseguito sempre // Meglio: if (x > 0) { do_something(); do_other(); }
Caratteristiche principali:
L'indentazione (tab/spazio) influisce sullo scope di if?
No, nel linguaggio C lo scope è definito solo dalle parentesi, non dall'indentazione.
Quale comportamento avrà questo codice?
if (a > 0) fun1(); fun2();
fun1() verrà chiamata solo se a > 0. fun2() verrà sempre chiamata indipendentemente dalla condizione.
Quali sono le conseguenze se dimentico di aggiungere le parentesi quando aggiungo una nuova riga?
Questo codice può modificare il comportamento e portare a errori che sono difficili da individuare visivamente, poiché l'indentazione non protegge da errori di compilazione.
Uno sviluppatore ha aggiunto un secondo statement in un if a riga singola, dimenticando di aggiungere le parentesi.
if (user) initialize(); log_access();
Pro:
Contro:
Uno sviluppatore utilizza sempre le parentesi graffe anche per un singolo statement:
if (user) { initialize(); log_access(); }
Pro:
Contro: