Guida di C (base)

Esecuzione condizionale: if

Inizio subito premettendo che l'istruzione che vedremo in questo capitolo, if, è una delle istruzioni fondamentali, non solo del C, ma della programmazione in generale.

Il compito di if è eseguire una (o più) istruzioni solo se una data condizione è vera. Mi spiego meglio con un esempio:

if (anni >= 18) printf("Sei maggiorenne!\n");

Intuitivamente, il compito di questo frammento di codice è stampere la stringa "Sei maggiorenne!" solo se la variabile anni contiene un numero maggiore o uguale a 18. Se anni è inferiore di 18, l'istruzione printf non sarà  eseguita.

Esaminando il codice più nel dettaglio si osserva che l'istruzione if è posta nella forma if (condizione) istruzione, dove:

  • condizione è una qualsiasi espressione che può assumere valore di vero o falso. Ricordo che un qualsiasi numero diverso da zero in C è interpretato come vero, quindi un'istruzione del tipo if ( 5 ) printf("ciao"); stamperà  ciao in ogni caso.
  • istruzione è una qualsiasi istruzione del linguaggio C. Si osservi che con una si intende una sola istruzione, quindi occhio a non cadere in errori del tipo if (giorno == 27) printf("è il giorno dello stipendio!"); stipendio += 1000;: questo codice stampa la scritta solo se giorno contiene effettivamente '27', ma l'istruzione stipendio += 1000 viene eseguita (assieme a tutte le eventuali istruzioni successive) in ogni caso, perchè di fatto si trova fuori dall'if! Per eseguire diverse istruzioni esse vanno racchiuse tra parentesi graffe, in modo da creare un blocco di istruzioni: if (giorno == 27) { printf("è il giorno dello stipendio!"); stipendio += 1000; }. Un blocco di istruzioni ({ ... }) in programmazione conta come un'istruzione sola.

Come in tutti gli altri casi, anche l'istruzione if può essere suddivisa su più righe:

if (anni >= 18)
	printf("Sei maggiorenne!\n");

In questo caso però è necessario ricordarsi che dopo la condizione non va messo il punto e virgola, perchè sarebbe come dire che l'istruzione termina lì, e quindi tutto il resto verrebbe eseguito in ogni caso (vale sempre la regola del provare per credere).

è possibile indicare, dopo l'if, un'istruzione da eseguire nel caso in cui la condizione sia falsa. In questo caso si usa else:

if (anni >= 18)
	printf("Sei maggiorenne!\n");
else
	printf("Devi ancora crescere...\n");

Notare che neanche else vuole il punto e virgola, per lo stesso motivo di if.

Operatori relazionali

Nel 99% dei casi la condizione dell'if contiene un confronto tra due elementi (nell'esempio si confrontano la variabile anni ed il numero 18). Un confronto è un'operazione al centro della quale si trova un operatore relazionale.

Per questo è essenziale avere un'idea di quali sono gli operatori relazionali presenti nel C:

  • a == b è vera solo se a è uguale a b.
  • a != b è vera solo se a è diverso da b.
  • a > b è vera solo se a è maggiore di b.
  • a < b è vera solo se a è minore di b.
  • a >= b è vera solo se a è maggiore od uguale a b.
  • a <= b è vera solo se a è minore od uguale a b.

è indispensabile non confondere MAI l'operatore == con l'operatore =:

anni == 18 confronta il valore di anni con il numero 18, e l'espressione vale '1' (vero; se anni contiene 18) o '0' (falso; se anni non contiene 18).

anni = 18 assegna il valore 18 alla variabile anni. L'intera espressione, come abbiamo già  visto, vale il valore assegnato, 18 (il che, all'interno di un if, sarebbe erroneamente interpretato come una condizione vera).

Scelte multiple: switch

Potrebbe essere necessario dover valutare una variabile su molti valori diversi, ad esempio consideriamo un voto scolastico, che ci interessa commentare solo nei casi in cui esso sia uguale a 2, 6 o 10:

#include <stdio.h>

main()
{
	int voto;
	printf("Che voto hai preso oggi? ");
	scanf("%d",&voto);

	if (voto == 2) {
		printf("Che schifo!\n");
	} else	if (voto == 6) {
			printf("Per un pelo!\n");
		} else	if (voto == 10) {
				printf("Non ci credo!\n");
			} else { printf("Non mi interessa commentare questo voto...\n"); }
}

La struttura funziona, ma è piuttosto articolata e poco leggibile. Per ovviare a questo problema il C mette a disposizione il costrutto switch; vediamo come riscrivere l'algoritmo utilizzando tale costrutto:

switch (voto) {
case 2:
	printf("Che schifo!\n");
	break;
case 6:
	printf("Per un pelo!\n");
	break;
case 10:
	printf("Non ci credo!\n");
	break;
default:
	printf("Non mi interessa commentare questo voto...\n");
}

lo switch sceglie quali istruzioni eseguire a seconda del valore di una variabile (nel nostro caso voto).

Se il valore della variabile è uguale ad uno di quelli previsti, il programma esegue tutte le istruzioni che seguono il case corrispondente, finchè non incontra un break. Per questo è importante non dimenticare il break, altrimenti tutte le istruzioni successive saranno eseguite comunque!

Se non esiste un case corrispondente, il programma passerà  ad eseguire le istruzioni successive a default.

Espressioni condizionali

Uno dei tipici usi dell'if è assegnare il valore ad una variabile in dipendenza da una condizione:

if (voto < 6) {
	paghetta = 0;
} else {
	paghetta = 10;
}

Per abbreviare questo genere di operazioni, il C mette a disposizione un operatore estremamente sintetico e schematico, nel perfetto stile del linguaggio:

paghetta = (voto < 6) ? 0 : 10;

Che corrisponde, appunto, ad assegnare alla variabile paghetta il primo valore (quello subito dopo il punto di domanda) se la condizione voto < 6 è vera, o il secondo (quello subito dopo i due punti) se la condizione è falsa.

Conclusioni

Come di consueto, riassumo in breve il contenuto dell'articolo:

  • L'if è una delle strutture di controllo fondamentali della programmazione, che permette di selezionare un blocco di codice da eseguire o meno, sulla base di una condizione.
  • La forma base dell'if è if (condizione) istruzione1 else istruzione2. La prima istruzione sarà  eseguita se la condizione è vera, altrimenti sarà  eseguita la seconda.
  • Più istruzioni possono essere raggruppate in un blocco, utilizzando le parentesi graffe: { istruzione1; istruzione2; ... }. Un blocco conta come un'istruzione sola.
  • Un'espressione è considerata vera se è diversa da 0, altrimenti è considerata falsa. Qualsiasi espressione in C ha un valore numerico, e quindi ogni tipo di espressione può essere considerata una condizione: occhio a non confondere gli operatori!
  • Una condizione è generalmente un confronto tra due valori, attuato con gli operatori di confronto: ==, !=, <=, >=, <, >. Un'espressione di confronto vale 1 se il confronto è veritiero, 0 altrimenti.
  • Il costrutto switch è utile per rendere più leggibile il codice nel caso in cui sia necessario confrontare una variabile rispetto a molti valori costanti.
  • Per velocizzare le operazioni di assegnamento, il C dispone di un curioso operatore ternario: a = (condizione) ? b : c;. La variabile a varrà  b se la condizione è vera, c se è falsa.

Mancano ormai pochi capitoli alla fine di questo corso base: nel prossimo vedremo come utilizzare i cicli per eseguire più volte uno stesso blocco di codice. A presto!

  1. Introduzione
  2. Preparare l'ambiente
  3. Il primo programma
  4. La funzione printf()
  5. Le variabili
  6. Input da tastiera
  7. Esecuzione condizionale: if
  8. Cicli
  9. Esempi
  10. Bibliografia