C/Blocchi e funzioni/Blocchi if e switch
I blocchi if e switch sono detti di selezione perché "selezionano" le opzioni a seconda di una condizione.
Verità e falsità in C
[modifica | modifica sorgente]Prima di poter usare blocchi if e switch è bene sapere che cosa intende il C per vero o falso.
- Un'espressione in C è ritenuta falsa se il suo valore è uguale allo zero binario, vera se il suo valore è diverso dallo zero binario.
- Gli operatori logici (
==
,!=
,<
,<=
,>
,>=
) rendono uno se l'espressione è logicamente vera, e zero se l'espressione è logicamente falsa. - Più in generale, qualsiasi istruzione C (assegnazione di variabile/operazione logica/operazione matematica) restituisce sempre un risultato e può quindi essere valutata in termini di vero/falso. Ad esempio, l'istruzione di assegnazione
a=3;
è vera (il valore restituito è 3) mentreb=0;
è falsa (il valore restituito è 0).
Blocco if
[modifica | modifica sorgente]Il blocco if esegue un'azione se la condizione specificata tra parentesi è vera.
Blocco if semplice
[modifica | modifica sorgente]Questa istruzione esegue semplicemente un'istruzione se l'espressione specificata è vera. L'espressione va sempre racchiusa tra parentesi.
Sintassi
[modifica | modifica sorgente]if (espressione)
istruzione;
oppure, se si desiderano eseguire più istruzioni, le si racchiude in un blocco.
if (espressione)
{
istruzione1;
istruzione2;
istruzioneN;
}
Esempi d'uso
[modifica | modifica sorgente]if ((c+b/7)==45)
{
myvar=14;
printf("c+b/7 è uguale a 45");
}
Blocco if-else
[modifica | modifica sorgente]Se la condizione è vera, si eseguono le istruzioni specificate dall'if; se è falsa quelle specificate dal blocco else.
Sintassi
[modifica | modifica sorgente]if (condizione)
{
/* istruzione da eseguire se la condizione è Vera */
}
else
{
/* istruzione da eseguire se la condizione è Falsa */
}
Esempi d'uso
[modifica | modifica sorgente]if ((c+b/7)==45)
{
myvar=14;
printf("c+b/7 è uguale a 45");
}
else
{
myvar=7;
printf("c+b/7 non è uguale a 45");
}
Blocco if-else if-else
[modifica | modifica sorgente]Se la condizione specificata nell'if è vera, si eseguono le istruzioni specificate dall'if, altrimenti se è vera una delle condizioni specificate in un else if
si eseguono le istruzioni specificate dall'else if. Se nessuna delle espressioni è vera, si eseguono le istruzioni specificate dall'else.
Sintassi
[modifica | modifica sorgente]if (condizione1)
{
/* istruzione da eseguire se condizione1 è Vera */
}
else if (condizione2)
{
/* istruzione da eseguire se condizione2 è Vera */
}
else if (condizioneN)
{
/* istruzione da eseguire se condizioneN è Vera */
}
else
{
/* istruzione da eseguire se nessuna condizione è Vera */
}
Esempi d'uso
[modifica | modifica sorgente]int myvar;
if ((c+b/7)==45)
{
myvar=14;
printf("c+b/7 è uguale a 45");
}
else if ((c+b/7)==47)
{
myvar=15;
printf("c+b/7 è uguale a 47");
}
else
{
myvar=0;
printf("I numeri inseriti non sono validi.");
}
L'operatore '?'
[modifica | modifica sorgente]Il blocco if-else
può essere sostituito dall'operatore ?
. Per esempio:
((c+b/7) == 45) ? myvar=14 : myvar=7;
Questo è equivalente al secondo esempio (eccetto per i printf
).
Un altro possibile uso è un'assegnazione condizionale:
i = j<10 ? 5 : 6;
che equivale a:
if (j<10) i = 5;
else i = 6
Blocco switch-case
[modifica | modifica sorgente]Il blocco switch-case
permette di selezionare un'istruzione da eseguire in base ad una variabile.
Blocco switch-case semplice
[modifica | modifica sorgente]Questo blocco seleziona semplicemente un'istruzione tra le proposte in base ad una variabile.
L'istruzione break
interrompe l'elaborazione del blocco switch, in modo da uscire subito dal blocco se una condizione è vera. L'istruzione break è opzionale, ma se non viene usata, vengono eseguite le istruzioni dei casi seguenti.
Sintassi
[modifica | modifica sorgente]switch (variabile)
{
case valore1:
// istruzione1
break;
case valore2:
// istruzione2
break;
case valoreN:
// istruzioneN
break;
}
Esempi d'uso
[modifica | modifica sorgente]switch (myVar)
{
case 1:
printf("myVar è uguale a 1");
break;
case 2:
printf("myVar è uguale a 2");
break;
}
switch (myVar)
{
case 1:
case 2:
printf("myVar è uguale a 1 o a 2");
break;
case 3:
printf("myVar è uguale a 3");
// Cade nel caso 4
case 4:
printf("myVar è uguale a 3 o 4");
break;
}
Dopo l'ultimo caso, l'istruzione "break" è inutile, ma è meglio inserirla ugualmente per evitare errori nel caso si aggiungessero altri casi.
Quasi sempre, prima di una parola-chiave "case", c'è:
- Un altro "case".
- Un'istruzione "break" o "return" o "continue" o "goto" (che non è molto consigliato), che fa uscire dal blocco "switch".
Nei casi, come quello dell'esempio precedente, in cui non fosse così, è bene segnalare la situazione con un commento.
In questo esempio le istruzioni vengono eseguite se myVar è uguale a 1 o a 2.
Istruzione switch-case-default
[modifica | modifica sorgente]Come la precedente, solo che se non si avvera nessuna delle condizioni, viene eseguita l'istruzione specificata dal caso default
.
int main(void)
{
int scelta;
printf("Inserisci Una Scelta: ");
scanf("%d", &scelta);
switch(scelta){
case 1: printf("Scelta 1\n"); break;
case 2: printf("Scelta 2\n"); break;
case 3: printf("Scelta 3\n"); break;
default: printf("Altra Scelta\n"); break;
}
}