Ciclo Do While in Linguaggio C

L'istruzione do while permette di realizzare cicli in cui il corpo del ciclo stesso venga eseguita almeno una volta.

La sintassi dell'istruzione do while, infatti, prevede due parti: il corpo del ciclo e la condizione di controllo. Il corpo viene eseguito prima della verifica della condizione per cui un ciclo do while garantisce che il corpo venga sempre eseguito almeno una volta.

In questa lezione vedremo come usare un ciclo do while, qual è la sua sintassi e quali sono le differenze rispetto ad un normale ciclo while.

Concetti Chiave
  • Usando l'istruzione do while è possibile realizzare cicli in cui la condizione viene valutata alla fine del corpo del ciclo;
  • In questo modo il corpo del ciclo viene eseguito sempre almeno una volta.

Istruzione do while

L'istruzione do while è strettamente correlata all'istruzione while. Infatti, si può affermare che l'istruzione do consiste essenzialmente in un'istruzione while la cui espressione di controllo viene valutata dopo ogni esecuzione del corpo del ciclo.

La forma dell'istruzione do while è la seguente:

do istruzione while ( espressione );
Diagramma di flusso dell'istruzione do while
Figura 1: Diagramma di flusso dell'istruzione do while

L'espressione di controllo dell'istruzione do while deve essere racchiusa tra parentesi. Inoltre, come per il caso dell'istruzione while, il corpo dell'istruzione do while può essere un'unica istruzione oppure un'istruzione composta:

do {
    istruzione_1;
    istruzione_2;
    /* ... */
    istruzione_n;
} while ( espressione );

Quando viene eseguita un'istruzione do while, viene eseguito dapprima il corpo del ciclo quindi, successivamente, viene controllata l'espressione di controllo. Se il valore dell'espressione di controllo è diverso da zero, quindi l'espressione risulta vera, il corpo del ciclo viene eseguito di nuovo e l'espressione viene controllata ancora. L'esecuzione di un'istruzione do termina quando l'espressione ha valore pari a zero, quindi falsa, dopo che il corpo del ciclo è stato eseguito.

Per chiarire meglio la differenza tra un'istruzione do ed un'istruzione while conviene ritornare all'esempio fatto nella lezione sull'istruzione while: la stampa di un conto alla rovescia.

Nella lezione sull'istruzione while abbiamo implementato un programma che stampa un conto alla rovescia partendo da 10, in questo modo:

#include <stdio.h>

int main() {
    int n = 10;
    while (n > 0) {
        printf("%d\n", n);
        n--;
    }
    printf("Partenza!\n");
    return 0;
}

Volendo scrivere lo stesso programma utilizzando l'istruzione do while possiamo implementarlo in questo modo:

#include <stdio.h>

int main() {
    int n;
    n = 10;
    do {
        printf("%d\n", n);
        --n;
    } while (n > 0);
    printf("Partenza!\n");
    return 0;
}

Andando ad esaminare il comportamento di questo programma vediamo che:

  • Quando l'istruzione do viene eseguita, viene eseguito dapprima il corpo del ciclo. Per tal motivo viene stampato dapprima il numero e poi decrementata la variabile n. A questo punto n vale 9;
  • Successivamente viene testata la condizione n > 0 che risulta vera in quanto n vale 9;
  • Il corpo del ciclo viene, quindi, eseguito una seconda volta;
  • Il corpo del ciclo verrà eseguito tante volte finché non viene stampato il messaggio 1 e la variabile n decrementata ad assumere il valore 0;
  • A questo punto la condizione viene valutata e risulta falsa e il ciclo termina.

Come possiamo vedere, spesso un ciclo while ed un ciclo do while sono indistinguibili. La vera differenza sta nel fatto che la condizione viene valutata dopo l'esecuzione del corpo del ciclo. Questa caratteristica ha un'importante conseguenza:

Definizione

Il corpo di un ciclo do while viene eseguito sempre almeno una volta.

A differenza di un ciclo while, il corpo di un ciclo do while viene eseguito prima della valutazione dell'espressione di controllo. Per tal motivo, anche se l'espressione di controllo risulta falsa prima ancora dell'avvio del ciclo, il corpo di un ciclo do while viene eseguito sempre almeno una volta.

Questa è una differenza cruciale rispetto al ciclo while in cui il corpo potrebbe non essere eseguito nemmeno una volta.

Una buona norma di programmazione è quella di adoperare comunque le parentesi per racchiudere il corpo di un ciclo do while anche se non sono necessarie. Questo perché codici come il seguente possono trarre in inganno un lettore poco attento:

do
    n = n / 2;
while (n > 0);

Ad una lettura poco attenta, infatti, il while alla terza riga potrebbe sembrare l'inizio di un'istruzione while.

Consiglio

Conviene sempre racchiudere il corpo di un ciclo do tra parentesi.

Per migliorare la leggibilità del codice conviene sempre racchiudere il corpo del ciclo do tra parentesi.

Quindi bisogna di evitare di scrivere codice in questo modo:

do
    istruzione;
while (condizione);

Invece conviene scrivere in questo modo:

do {
    istruzione;
} while (condizione);

In Sintesi

In questa lezione abbiamo studiato la seconda istruzione messa a disposizione dal linguaggio C per la realizzazione di cicli: l'istruzione do while.

A differenza dell'istruzione while, con l'istruzione do while l'espressione di controllo che determina l'esecuzione della prossima iterazione viene valutata dopo il corpo del ciclo stesso. Questo garantisce che il corpo del ciclo venga sempre eseguito almeno una volta.

Nella prossima lezione studieremo l'istruzione for che consente di realizzare cicli in maniera estremamente flessibile.