Ogni programma che si rispetti necessita, nella maggior parte dei
casi, di dover intraprendere operazioni diverse a seconda del verificarsi
o meno di determinate condizioni.
Ad es. se lutente immette un valore non adeguato come risposta
ad un prompt del programma, lesecuzione può non poter procedere
regolarmente e si deve prevedere un comportamento opportuno per
ripristinare la correttezza delle informazioni, tipicamente riproponendo
la richiesta o terminando il programma.
Per poter realizzare operazioni di questo tipo, il C offre diverse
soluzioni.
Iniziamo ad esaminare la struttura di controllo condizionale più
semplice, ovvero listruzione if, il cui uso è il seguente:
if (questa condizione è
vera)
esegui questa istruzione;
La parola chiave if indica che occorre eseguire un test sulla
condizione racchiusa tra parentesi tonde; se la condizione è verificata
bisogna eseguire listruzione indicata successivamente.
Esaminiamo ad es. il seguente codice:
if ( eta >= 100 )
printf(Complimenti %s!\n, nome);
printf(Attendere prego...\n);
Se listruzione non è verificata, listruzione non viene
eseguita e il controllo passa allistruzione successiva allif;
nellesempio precedente se letà dellutente è inferiore
a 100 anni, allora non viene stampata la stringa con i complimenti
e lesecuzione passa direttamente alla stampa della stringa
di attesa.
Se al verificarsi della condizione occorre eseguire più linee
di codice, basta inserire un blocco di istruzioni (v. lezione 22),
ad es. potremmo voler estendere lesempio precedente nel seguente
modo:
if ( eta >= 100 ) {
printf(Complimenti %s!\n, nome);
occupazione = nonno;
}
printf(Attendere prego...\n);
Più in generale può essere necessario intraprendere operazioni alternative,
specificando le istruzioni da eseguire quando la condizione non
è verificata.
In questo caso si può utilizzare la parola chiave else, che
permette di costruire strutture di controllo del tipo:
if (questa condizione è
vera)
esegui questa istruzione;
else /* altrimenti */
esegui questaltra istruzione;
Ad es.:
if ( eta >= 18 )
maggiorenne = TRUE;
else
maggiorenne = FALSE;
Se le alternative da gestire sono più di due, è facile estendere
luso di else, ricorrendo a strutture di tipo else-if
del tipo:
if (questa condizione è
vera)
esegui questa istruzione;
else if (questaltra condizione è vera)
esegui questaltra istruzione;
else
esegui questaltra istruzione;
Ad es.:
if ( a > 0 )
printf(Risultato positivo!\n);
else if ( a < 0 )
printf(Risultato negativo!\n);
else
printf(Risultato nullo!\n);
La condizione da verificare può essere unespressione più o
meno complessa, ottenuta concatenando più condizioni mediante gli
operatori logici visti la scorsa lezione, ad es.:
if ( (a > 0) &&
(a % 2 == 0) )
printf(Risultato positivo pari!\n);
Si faccia molta attenzione quando si testa una condizione di uguaglianza.
Infatti un errore molto frequente, soprattutto agli inizi, è quello
di scrivere un solo segno '=' invece di due, il che determina comportamenti
strani difficili da individuare e correggere.
Il motivo principale è che in C non esiste il tipo booleano e il
test della condizione è ritenuto vero se il valore dell'espressione
è diverso da zero, falso se l'espressione è nulla.
Scriviamo il seguente programma:
#include <stdio.h>
int main (int argc, char *argv)
{
int a;
if ( a = 0 )
a++;
printf("a=%d\n", a);
return 0;
}
Proviamo a compilarlo e notiamo che non ci viene segnalato dal
compilatore alcun errore o avvertimento.
L'output di questo semplice esempio è:
a=0
Se scriviamo come condizione dell'if:
if ( a = 1 )
l'esecuzione del programma ci darà:
a=2
Questo dimostra che mentre nel primo caso non viene eseguito l'incremento
di a, nel secondo caso invece, poiché l'espressione da testare
ha valore diverso da 0, l'incremento viene effettuato.
Vedremo alcuni altri aspetti delicati che riguardano le strutture
di controllo nella prossima lezione.
Torna all'indice Generale del corso di Corso di C con Linux di Software Planet