Barninga Z
a- a+

Il flusso elaborativo: while

while

Mediante l'istruzione while è possibile definire un ciclo ripetuto finché una data condizione risulta vera. Vediamo subito un esempio: 

while(a < b) {
        printf("a = %d
" ,a);
        ++a;
    }

Le due righe comprese tra le graffe sono eseguite finché la variabile a, incremento dopo incremento, diventa uguale a b. A questo punto l'esecuzione prosegue con la prima istruzione che segue la graffa chiusa. 

Vale la pena di addentrarsi un poco nell'algoritmo, esaminando con maggiore dettaglio ciò che accade. Come prima operazione viene valutato se a è minore di b (la condizione deve essere espressa tra parentesi tonde). Se essa risulta vera vengono eseguiti la printf() e l'autoincremento di a, per ritornare poi al confronto tra a e b. Se la condizione è vera il ciclo è ripetuto, altrimenti si prosegue, come già accennato, con quanto segue la parentesi graffa chiusa. 

Se ne trae, innanzitutto, che se al primo test la condizione non è vera, il ciclo non viene eseguito neppure una volta. Inoltre è indispensabile che all'interno delle graffe accada qualcosa che determini le condizioni necessarie per l'uscita dal ciclo: in questo caso i successivi incrementi di a rendono falsa, prima o poi, la condizione da cui tutto il ciclo while dipende. 

Esiste però un altro metodo per abbandonare un ciclo al verificarsi di una certa condizione: si tratta dell'istruzione break[4]. Esempio: 

while(a < b) {
        printf("a = %d
" ,a);
        if(++a == 100)
            break;
        --c;
    }

In questo caso a è incrementata e poi confrontata con il valore 100: se uguale, il ciclo è interrotto, altrimenti esso prosegue con il decremento di c. E' anche possibile escludere dall'esecuzione una parte del ciclo e forzare il ritorno al test: 

while(a < b) {
        if(a++ < c)
            continue;
        printf("a = %d
" ,a);
        if(++a == 100)
            break;
        --c;
    }

Nell'ultimo esempio presentato, a viene confrontata con c ed incrementata. Se, prima dell'incremento essa è minore di c il flusso elaborativo ritorna al test dell'istruzione while; la responsabile del salto forzato è l'istruzione continue, che consente di iniziare da capo una nuova iterazione. In caso contrario viene chiamata printf() e, successivamente, viene effettuato il nuovo test con eventuale uscita dal ciclo. 

I cicli while possono essere annidati: 

while(a < b) {
        if(a++ < c)
            continue;
        printf("a = %d
" ,a);
        while(c < x)
            ++c;
        if(++a == 100)
            break;
        --c;
    }

All'interno del ciclo per (a < b) ve n'è un secondo, per (c < x). Già nella prima iterazione del ciclo "esterno" , se la condizione (c < x) è vera si entra in quello "interno" , che viene interamente elaborato (cioè c è incrementata finché assume valore pari ad x) prima che venga eseguita la successiva istruzione del ciclo esterno. In pratica, ad ogni iterazione del ciclo esterno avviene una serie completa di iterazioni nel ciclo interno. 

Va sottolineato che eventuali istruzioni break o continue presenti nel ciclo interno sono relative esclusivamente a quest'ultimo: una break produrrebbe l'uscita dal ciclo interno e una continue il ritorno al test, sempre del ciclo interno. 

Si può ancora notare, infine, che il ciclo per (c < x) si compone di una sola istruzione: proprio per questo motivo è stato possibile omettere le parentesi graffe.

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Lorenzo
Hai qualche domanda da fare?