- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
Il flusso elaborativo: if else
if... else
L'esecuzione condizionale nella forma più semplice è specificata tramite la parola chiave if, la quale indica al compilatore che l'istruzione seguente deve essere eseguita se la condizione, sempre specificata tra parentesi, è vera. Se la condizione non è verificata, allora l'istruzione non è eseguita e il flusso elaborativo salta all'istruzione successiva. L'istruzione da eseguire al verificarsi della condizione può essere una sola linea di codice, chiusa dal punto e virgola, oppure un blocco di linee di codice, ciascuna conclusa dal punto e virgola e tutte quante comprese tra parentesi graffe. Esempietto:
if(a == b)
printf("a è maggiore di b
");
if(a == c) {
printf("a è maggiore di c
");
a = c;
}
Nel codice riportato, se il valore contenuto in a
è uguale a quello contenuto in b viene visualizzata la
stringa "a è maggiore di b"; in caso
contrario la chiamata a printf() non è eseguita e
l'elaborazione prosegue con la successiva istruzione, che
è ancora una if. Questa volta, se a
è uguale a c viene eseguito il blocco di
istruzioni comprese tra le parentesi graffe, altrimenti esso
è saltato "a pié pari" e il programma
prosegue con la prima istruzione che segue la graffa
chiusa.
Come regola generale, una condizione viene espressa tramite
uno degli operatori logici
del C ed è sempre racchiusa tra parentesi
tonde.
La if è completata dalla parola chiave
else, che viene utilizzata quando si devono definire
due possibilità alternative; inoltre più
strutture if...else possono essere annidate qualora
serva effettuare test su più "livelli" in
cascata:
if(a == b)
printf("a è maggiore di b
");
else {
printf("a è minore o uguale a b
")
if(a < b)
printf("a è proprio minore di b
");
else
printf("a è proprio uguale a b
");
}
Quando è presente la else, se la condizione
è vera viene eseguito solo ciò che sta tra la
if e la else; in caso contrario è
eseguito solo il codice che segue la else stessa.
L'esecuzione dei due blocchi di codice è, in altre
parole, alternativa.
E' estremamente importante ricordare che ogni
else viene dal compilatore riferita all'ultima
if incontrata: quando si annidano costruzioni
if...else bisogna quindi fare attenzione alla
costruzione logica delle alternative. Cerchiamo di chiarire
il concetto con un esempio.
Supponiamo di voler codificare in C il seguente algoritmo:
se a è uguale a b allora si
controlla se a è maggiore di c. Se
anche questa condizione è vera, si visualizza un
messaggio. Se invece la prima delle due condizioni è
falsa, cioè a non è uguale a
b, allora si assegna a c il valore di
b. Vediamo ora un'ipotesi di codifica:
if(a == b)
if(a > c)
printf("a è maggiore di c
");
else
c = b;
I rientri dal margine sinistro delle diverse righe evidenziano che le intenzioni sono buone: è immediato collegare, da un punto di vista visivo, la else alla prima if. Peccato che il compilatore non si interessi affatto alle indentazioni: esso collega la else alla seconda if, cioè all'ultima if incontrata. Bisogna correre ai ripari:
if(a == b)
if(a > c)
printf("a è maggiore di c
");
else;
else
c = b;
Quella appena vista è una possibilità. Introducendo una else "vuota" si raggiunge lo scopo, perché questa è collegata all'ultima if incontrata, cioè la seconda. Quando il compilatore incontra la seconda else, l'ultima if non ancora "completa" , risalendo a ritroso nel codice, è la prima delle due. I conti tornano... ma c'è un modo più elegante.
if(a == b) {
if(a > c)
printf("a è maggiore di c
");
}
else
c = b;
In questo caso le parentesi graffe indicano chiaramente al
compilatore qual è la parte di codice che dipende
direttamente dalla prima if e non vi è il
rischio che la else sia collegata alla seconda, dal
momento che questa è interamente compresa nel blocco
tra le graffe e quindi è sicuramente
"completa".
Come si vede, salvo alcune particolarità, nulla
diversifica la logica della if del C da quella delle
if (o equivalenti parole chiave) disponibili in
altri linguaggi di programmazione[1].
- Articolo precedente Le istruzioni di controllo generale
- Articolo successivo Il flusso elaborativo: switch
Ti potrebbe interessare anche
commenta la notizia
Chiedi alla nostra Redazione!