27.1 If ed Else
L'istruzione if e' senza dubbio il costrutto piu' comune adottato dai vari linguaggi di programmazione: la sua sintassi e':
il costrutto if termina sempre con il punto e virgola, a meno che non racchiuda piu' istruzioni al suo interno: in questo caso occorre delimitare il blocco di istruzioni tra parentesi graffe:
ogni singola istruzione termina con il punto e virgola, ma il blocco di istruzioni termina con la parentesi graffa. Se e' vera la condizione tra parentesi tonde (if significa appunto 'se'), viene eseguita l'istruzione che segue fino al punto e virgola, oppure il blocco di istruzioni successivo fino alla chiusura della parentesi graffa. La if puo' contenere una 'else' (che significa 'altrimenti') opzionale, che permette di specificare le istruzioni da eseguire nel caso la condizione tra parentesi tonde non sia verificata. Si possono 'annidare' piu' if una dentro l'altra e possono essere presenti piu' else. Ad esempio:
Occorre osservare che ciascuna else fa riferimento alla if immediatamente precedente (cosi' come mostrato anche dall'indentazione). Per collegare una else ad una if che non sia immediatamente precedente, occorre usare le parentesi graffe:
in questo modo l'else fa riferimento alla prima if e non a quella immediatamente precedente. Infatti le istruzioni che devono essere eseguite nel caso si verifichi la condizione tra parentesi tonde, sono racchiuse in un blocco delimitato dalle parentesi graffe: l'ultima istruzione eseguita e' quella immediatamente precedente alla parentesi graffa chiusa. In pratica un blocco puo' essere visto logicamente come un'unica istruzione, percio' ora risulta evidente come l'else sia in questo modo collegata alla if precedente alle parentesi graffe (in questo caso la prima if). Occorre prestare attenzione ad errori subdoli come questo:
infatti in quest'ultimo caso l'else fa riferimento alla seconda if e non alla prima, cioe' alla if immediatamente precedente al blocco di parentesi graffe. E' evidente che l'indentazione non corrisponde a quanto viene effettivamente eseguito dal compilatore e puo' far confondere leggendo il codice con poca attenzione. Come gia' detto, la valutazione di una condizione all'interno di un costrutto di controllo (if, while, for etc) produce un valore numerico che, in caso di condizione non verificata (cioe' falsa) corrisponde a 0 mentre in caso di condizione verificata (cioe' vera) corrisponde ad un qualsiasi valore diverso da zero (per definizione 1). Quindi un'espressione come questa: if(1) corrisponde ad una qualsiasi condizione che e' sempre verificata, cioe' sempre vera. 27.2 Switch
Un costrutto if e' certamente valido se occorre far eseguire alla macchina determinate istruzioni solamente al verificarsi di determinate condizioni. Quando pero' le condizioni da considerare sono molte, il costrutto if puo' rivelarsi poco maneggevole da usare e puo' essere piu' conveniente usare il costrutto switch. Il costrutto switch e' una struttura che permette di controllare piu' condizioni in un unico 'blocco' di codice. Piu' esattamente, lo switch consente di valutare un'espressione confrontandone il valore all'interno di un ristretto dominio di valori. La sintassi di tale costrutto e' la seguente:
dove 'espressione' e' la condizione che occorre esaminare, costante1, costante2, costante3 etc, sono i valori che puo' assumere la condizione (i casi, da case, caso). L'istruzione o le istruzioni che seguono i due punti (:) vengono eseguite al verificarsi di un dato caso. Qualora il valore della condizione non corrisponda ad alcun caso tra quelli previsti, vengono eseguite le istruzioni indicate dalla parola chiave 'default'. Vediamo un esempio:
l'istruzione break provoca l'uscita immediata dallo switch. Omettendo la parola chiave break, verranno eseguite tutte le istruzioni in cascata a partire da quella relativa al caso che si e' verificato. Ad esempio, nello switch seguente:
supponendo che il valore di c sia 'b', verranno eseguite la seconda e la terza printf() ed il risultato a video dara: hai digitato il carattere: bhai digitato il carattere: c. E' sempre buona norma inserire l'istruzione break al termine delle istruzioni associate all'etichetta 'default': cio' per evitare errori non previsti. L'istruzione break puo' essere inserita anche all'interno dei costrutti for, while e do-while; il risultato e' sempre lo stesso: l'uscita immediata. L'istruzione diametralmente opposta al break e' l'istruzione 'continue'. L'istruzione continue infatti, forza l'inizio dell'iterazione successiva del ciclo di for, while o do-while. Ecco un esempio di uso dell'istruzione 'continue':
nell'esempio precedente si poteva ovviamente evitare l'istruzione continue effettuando il test al contrario, eseguendo la printf() sono nel caso 'a[i] >= 0'. Ci sono casi pero' nei quali la condizione da verificare e' abbastanza complessa e l'istruzione continue puo' essere utilizzata per semplificare la scrittura del codice invertendo la condizione. Ad esempio:
lo stesso codice, omettendo l'istruzione continue, potrebbe diventare piu' difficoltoso da leggere:
27.3 Do-While e Goto
I costrutti While e For sono stati illustrati nel capitolo 2, occorre percio' analizzare l'ultimo costrutto di controllo: il Do-While. Nel costrutto While viene effettuato un test preliminare della condizione che, se risulta vera, comporta l'esecuzione delle istruzioni contenute all'interno delle parentesi graffe. Ne consegue che qualora la condizione non dovesse verificarsi mai, le istruzioni all'interno delle parentesi graffe non verrebbero eseguite nemmeno una volta. Tuttavia a volte si rende necessario eseguire tali istruzioni almeno una volta, risulterebbe pertanto utile un costrutto simile al While che permettesse l'esecuzione delle istruzioni prima di effettuare il controllo della condizione. Un costrutto del genere esiste ed e' appunto il Do-While. Nell'istruzione Do-While, prima vengono eseguite le istruzioni contenute all'interno delle parentesi graffe e poi viene controllata la condizione che, se risulta vera, provoca una successiva esecuzione delle istruzioni. Il While termina quando la condizione risulta falsa. La sintassi del Do-While e' la seguente:
Il costrutto goto non e' mai necessario in quanto lo stesso codice puo' essere scritto senza l'uso dell'istruzione goto. Inoltre l'uso eccessivo dell'istruzione goto rende il codice meno leggibile e l'individuazione di eventuali errori (debug) risulta piu' laboriosa. Chi conosce la programmazione strutturata e' a conoscenza del fatto che tale metodologia di sviluppo del codice proibisce l'uso dell'istruzione goto. Nella pratica l'esperienza insegna che la verita' assoluta non esiste quasi mai da una parte sola e che a volte, l'uso moderato ed oculato dell'istruzione goto, semplifica la vita al programmatore rendendo il codice ugualmente leggibile. D'altro canto, un uso esasperato della programmazione strutturata, puo' rendere paradossalmente il codice poco leggibile...ma si tratta ovviamente di opinioni personali...non me ne vogliano i puristi della strutturata! ;o) Ecco un esempio (tratto dal K&R) di uso dell'istruzione goto che permette di uscire contemporaneamente da due cicli di for nidificati:
l'istruzione goto permette di uscire contemporaneamente dai due cicli di for e di eseguire le istruzioni successive alla label (etichetta) 'errore'. L'istruzione goto effettua un salto al punto del programma identificato dalla label 'errore'. La label 'errore' seguita dai due punti (:) e' quindi il punto a partire dal quale verranno eseguite le istruzioni successive all'istruzione goto. Il nome della label e' scelto dal programmatore. Inizio della guida Gli operatori Indice Il preprocessore Copyright (c) 2002-2003 Maurizio Silvestri |