Barninga Z
a- a+

Il flusso elaborativo: if else

if... else

L'esecuzione condizionale nella forma più sempliceè specificata tramite la parola chiave if, laquale indica al compilatore che l'istruzione seguentedeve essere eseguita se la condizione, sempre specificata traparentesi, è vera. Se la condizione non èverificata, allora l'istruzione non è eseguita eil flusso elaborativo salta all'istruzione successiva.L'istruzione da eseguire al verificarsi della condizionepuò essere una sola linea di codice, chiusa dal puntoe virgola, oppure un blocco di linee di codice, ciascunaconclusa dal punto e virgola e tutte quante comprese traparentesi 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 lastringa "a è maggiore di b"; in casocontrario la chiamata a printf() non è eseguita el'elaborazione prosegue con la successiva istruzione, cheè ancora una if. Questa volta, se aè uguale a c viene eseguito il blocco diistruzioni comprese tra le parentesi graffe, altrimenti essoè saltato "a pié pari" e il programmaprosegue con la prima istruzione che segue la graffachiusa. 

Come regola generale, una condizione viene espressa tramiteuno degli operatori logicidel C ed è sempre racchiusa tra parentesitonde. 

La if è completata dalla parola chiaveelse, che viene utilizzata quando si devono definiredue possibilità alternative; inoltre piùstrutture if...else possono essere annidate qualoraserva effettuare test su più "livelli" incascata: 

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");  elseprintf("a è proprio uguale a b");    }

Quando è presente la else, se la condizioneè vera viene eseguito solo ciò che sta tra laif e la else; in caso contrario èeseguito solo il codice che segue la else stessa.L'esecuzione dei due blocchi di codice è, in altreparole, alternativa. 

E' estremamente importante ricordare che ognielse viene dal compilatore riferita all'ultimaif incontrata: quando si annidano costruzioniif...else bisogna quindi fare attenzione allacostruzione logica delle alternative. Cerchiamo di chiarireil concetto con un esempio. 

Supponiamo di voler codificare in C il seguente algoritmo:se a è uguale a b allora sicontrolla se a è maggiore di c. Seanche questa condizione è vera, si visualizza unmessaggio. Se invece la prima delle due condizioni èfalsa, cioè a non è uguale ab, allora si assegna a c il valore dib. 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 righeevidenziano che le intenzioni sono buone: è immediatocollegare, da un punto di vista visivo, la else allaprima if. Peccato che il compilatore non siinteressi affatto alle indentazioni: esso collega laelse alla seconda if, cioèall'ultima if incontrata. Bisogna correre airipari: 

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 raggiungelo scopo, perché questa è collegataall'ultima if incontrata, cioè laseconda. Quando il compilatore incontra la secondaelse, l'ultima if non ancora"completa" , risalendo a ritroso nel codice,è la prima delle due. I conti tornano... mac'è 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 alcompilatore qual è la parte di codice che dipendedirettamente dalla prima if e non vi è ilrischio che la else sia collegata alla seconda, dalmomento che questa è interamente compresa nel bloccotra le graffe e quindi è sicuramente"completa". 

Come si vede, salvo alcune particolarità, nulladiversifica la logica della if del C da quella delleif (o equivalenti parole chiave) disponibili inaltri linguaggi di programmazione[1]. 

 



Ti potrebbe interessare anche

commenta la notizia