programmazione
strutture di controllo Le strutture di controllo sono il cuore della logica di qualsiasi programma scritto in C. Grazie a istruzioni come if e switch è possibile prendere decisioni, mentre i cicli for, while e do...while consentono di automatizzare operazioni ripetitive, riducendo il codice e migliorandone l'efficienza.
         home page  
 

Le strutture di controllo nel linguaggio C: if, switch, for e while

Pubblicato il: 14-7-2026

Ultima Modifica: 14-7-2026

Ogni programma, anche il più semplice, deve essere in grado di prendere decisioni e ripetere determinate operazioni. Nel linguaggio C, questo è possibile grazie alle strutture di controllo, costrutti fondamentali che permettono di modificare il flusso di esecuzione del programma in base a condizioni o cicli.

Senza le strutture di controllo, un programma eseguirebbe semplicemente le istruzioni una dopo l'altra, senza poter reagire all'input dell'utente o eseguire operazioni ripetitive.

In questa guida analizzeremo nel dettaglio le principali strutture di controllo del linguaggio C:

  • if

  • if...else

  • switch

  • for

  • while

  • do...while

  • break

  • continue

Ogni argomento sarà accompagnato da esempi pratici e spiegazioni dettagliate.


📖 Cosa sono le strutture di controllo?

Le strutture di controllo permettono al programma di:

  • eseguire istruzioni solo in determinate condizioni;

  • scegliere tra più alternative;

  • ripetere blocchi di codice;

  • interrompere o modificare il comportamento dei cicli.

In pratica, rappresentano la "logica" del programma.


🟢 L'istruzione if

L'istruzione if permette di eseguire un blocco di codice solo se una determinata condizione risulta vera.

Sintassi

 
if (condizione)
{
    istruzioni;
}

Primo esempio

 
#include <stdio.h>

int main()
{
    int eta = 20;

    if (eta >= 18)
    {
        printf("Sei maggiorenne.\n");
    }

    return 0;
}

Output:

Sei maggiorenne.

Poiché la condizione è vera, il messaggio viene visualizzato.


🔍 Operatori di confronto

Le condizioni utilizzano normalmente questi operatori.

Operatore Significato
== uguale
!= diverso
> maggiore
< minore
>= maggiore o uguale
<= minore o uguale

Esempio:

 
if (numero == 10)

⚙️ Operatori logici

È possibile combinare più condizioni.

Operatore Significato
&& AND
|| OR
! NOT

Esempio:

 
if (eta >= 18 && eta <= 65)

Entrambe le condizioni devono essere vere.


🔵 if...else

Quando esistono due possibili alternative si utilizza else.

Sintassi

 
if (condizione)
{
    istruzioni;
}
else
{
    istruzioni;
}

Esempio

 
#include <stdio.h>

int main()
{
    int voto = 22;

    if (voto >= 18)
    {
        printf("Esame superato.\n");
    }
    else
    {
        printf("Esame non superato.\n");
    }

    return 0;
}

🟣 if...else if...else

Quando le alternative sono numerose.

 
if (media >= 90)
{
    printf("Ottimo");
}
else if (media >= 70)
{
    printf("Buono");
}
else if (media >= 60)
{
    printf("Sufficiente");
}
else
{
    printf("Insufficiente");
}

Le condizioni vengono controllate dall'alto verso il basso.


💡 Suggerimento

Quando le condizioni sono molte e riguardano lo stesso valore, spesso è preferibile utilizzare switch, che rende il codice più leggibile.


🟠 L'istruzione switch

Lo switch consente di scegliere quale blocco di codice eseguire tra numerose alternative.

Sintassi

 
switch (variabile)
{
    case valore:
        istruzioni;
        break;

    default:
        istruzioni;
}

Esempio

 
#include <stdio.h>

int main()
{
    int scelta = 2;

    switch (scelta)
    {
        case 1:
            printf("Nuovo documento\n");
            break;

        case 2:
            printf("Apri documento\n");
            break;

        case 3:
            printf("Esci\n");
            break;

        default:
            printf("Scelta non valida\n");
    }

    return 0;
}

Output:

Apri documento

🚨 L'importanza del break

Il comando break interrompe lo switch.

Senza break, l'esecuzione continua nei casi successivi.

Esempio:

 
switch(numero)
{
    case 1:
        printf("Uno\n");

    case 2:
        printf("Due\n");

    case 3:
        printf("Tre\n");
}

Se numero vale 1, verranno stampati:

Uno
Due
Tre

Questo comportamento è chiamato fall-through.


📝 Il caso default

default viene eseguito quando nessun case corrisponde.

default:
    printf("Comando sconosciuto");

Non è obbligatorio, ma è sempre consigliato.


🔄 Il ciclo for

Il ciclo for è ideale quando il numero di ripetizioni è noto.

Sintassi

 
for (inizializzazione; condizione; incremento)
{
    istruzioni;
}

Esempio

 
#include <stdio.h>

int main()
{
    int i;

    for(i = 1; i <= 5; i++)
    {
        printf("%d\n", i);
    }

    return 0;
}

Output

1
2
3
4
5

🔍 Analisi del for

 
for(i = 1; i <= 5; i++)

Significa:

  • i = 1 → inizializzazione

  • i <= 5 → condizione

  • i++ → incremento


⏬ Ciclo decrescente

 
for(i = 10; i >= 1; i--)
{
    printf("%d\n", i);
}

Output

10
9
8
...
1

♾️ Ciclo infinito

 
for(;;)
{
    printf("Ciao");
}

Questo ciclo non termina mai, a meno che non venga interrotto con break o con la chiusura del programma.


🔁 Il ciclo while

Il ciclo while viene utilizzato quando non si conosce in anticipo il numero delle ripetizioni.

Sintassi

 
while(condizione)
{
    istruzioni;
}

Esempio

 
#include <stdio.h>

int main()
{
    int numero = 1;

    while(numero <= 5)
    {
        printf("%d\n", numero);
        numero++;
    }

    return 0;
}

⚠️ Attenzione

Se la condizione rimane sempre vera, il ciclo diventa infinito.

Esempio:

 
while(1)
{
    printf("Errore");
}

🔂 Il ciclo do...while

Diversamente dal while, il do...while esegue sempre almeno una volta il blocco di codice.

Sintassi

 
do
{
    istruzioni;
}
while(condizione);

Esempio

 
int numero = 10;

do
{
    printf("%d\n", numero);
}
while(numero < 5);

Output

10

Anche se la condizione è falsa, il blocco viene eseguito una prima volta.


🛑 break

Il comando break interrompe immediatamente un ciclo.

Esempio

 
for(int i = 1; i <= 10; i++)
{
    if(i == 6)
        break;

    printf("%d\n", i);
}

Output

1
2
3
4
5

⏭️ continue

continue salta l'iterazione corrente e passa direttamente alla successiva.

 
for(int i = 1; i <= 5; i++)
{
    if(i == 3)
        continue;

    printf("%d\n", i);
}

Output

1
2
4
5

🧠 Cicli annidati

È possibile inserire un ciclo all'interno di un altro.

 
for(int r = 1; r <= 3; r++)
{
    for(int c = 1; c <= 4; c++)
    {
        printf("* ");
    }

    printf("\n");
}

Output

* * * *
* * * *
* * * *

🎯 Esempio pratico: tabellina del 7

 
#include <stdio.h>

int main()
{
    int i;

    for(i = 1; i <= 10; i++)
    {
        printf("7 x %d = %d\n", i, 7 * i);
    }

    return 0;
}

🎯 Esempio pratico: somma dei numeri

 
#include <stdio.h>

int main()
{
    int i;
    int somma = 0;

    for(i = 1; i <= 100; i++)
    {
        somma += i;
    }

    printf("Somma = %d\n", somma);

    return 0;
}

🎯 Esempio pratico: indovinare un numero

 
#include <stdio.h>

int main()
{
    int segreto = 8;
    int numero;

    do
    {
        printf("Indovina il numero: ");
        scanf("%d", &numero);

        if(numero < segreto)
            printf("Troppo piccolo!\n");

        if(numero > segreto)
            printf("Troppo grande!\n");

    } while(numero != segreto);

    printf("Complimenti! Hai indovinato.\n");

    return 0;
}

📊 Confronto tra le strutture di controllo

Struttura Quando usarla
if Per eseguire codice in base a una condizione
if...else Per scegliere tra due alternative
if...else if...else Per valutare più condizioni
switch Per confrontare un'espressione con valori costanti
for Quando si conosce il numero di iterazioni
while Quando il numero di iterazioni non è noto
do...while Quando il codice deve essere eseguito almeno una volta
break Per interrompere un ciclo o uno switch
continue Per saltare l'iterazione corrente

💡 Buone pratiche

  • ✔️ Usa sempre le parentesi graffe {} anche quando il blocco contiene una sola istruzione: il codice sarà più leggibile e meno soggetto a errori.

  • ✔️ Evita cicli infiniti, a meno che non siano realmente necessari (ad esempio nei server o nei programmi che restano sempre in esecuzione).

  • ✔️ Preferisci switch quando devi confrontare lo stesso valore con molte costanti.

  • ✔️ Usa nomi di variabili significativi, come contatore, indice o scelta, invece di nomi generici quando possibile.

  • ✔️ Controlla che la condizione di uscita dei cicli possa essere raggiunta, altrimenti il programma potrebbe bloccarsi.


🎓 Conclusioni

Le strutture di controllo sono il cuore della logica di qualsiasi programma scritto in C. Grazie a istruzioni come if e switch è possibile prendere decisioni, mentre i cicli for, while e do...while consentono di automatizzare operazioni ripetitive, riducendo il codice e migliorandone l'efficienza.

Imparare a scegliere la struttura più adatta a ogni situazione è una competenza fondamentale per ogni programmatore. Con un po' di pratica, l'uso di queste istruzioni diventerà naturale e ti permetterà di affrontare problemi sempre più complessi con codice chiaro, ordinato e facilmente manutenibile.