C/Blocchi e funzioni/Blocchi if e switch

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
CopertinaC/Copertina
IndiceC/Indice

I blocchi if e switch sono detti di selezione perché "selezionano" le opzioni a seconda di una condizione.

Verità e falsità in C[modifica]

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) mentre b=0; è falsa (il valore restituito è 0).

Blocco if[modifica]

Il blocco if esegue un'azione se la condizione specificata tra parentesi è vera.

Blocco if semplice[modifica]

Questa istruzione esegue semplicemente un'istruzione se l'espressione specificata è vera. L'espressione va sempre racchiusa tra parentesi.

Sintassi[modifica]

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]

if ((c+b/7)==45)
{
 myvar=14;
 printf("c+b/7 è uguale a 45");
}

Blocco if-else[modifica]

Se la condizione è vera, si eseguono le istruzioni specificate dall'if; se è falsa quelle specificate dal blocco else.

Sintassi[modifica]

if (condizione)
{
  /* istruzione da eseguire se la condizione è Vera */
}
else
{
  /* istruzione da eseguire se la condizione è Falsa */
}

Esempi d'uso[modifica]

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]

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]

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]

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]

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]

Il blocco switch-case permette di selezionare un'istruzione da eseguire in base ad una variabile.

Blocco switch-case semplice[modifica]

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]

switch (variabile)
{
 case valore1:
  // istruzione1
  break;
 
 case valore2:
  // istruzione2
  break;
 
 case valoreN:
  // istruzioneN
  break;
}

Esempi d'uso[modifica]

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]

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;
 }
}