Il costrutto while
Un ciclo while è leggermente meno sofisticato di un ciclo for, ma sostanzialmente assolve alle stesse funzioni. È composto da una condizione di controllo (o uscita) e da un corpo del ciclo. All'ingresso del ciclo e ogni volta che vengono eseguite tutte le istruzioni contenute nel corpo viene verificata la validità della condizione di controllo. Il ciclo termina quando la condizione, costituita da un'espressione booleana, restituisce il valore false.
La sintassi di un ciclo while è la seguente:
while (espr. booleana) {
corpo
}
Il primo esempio che riportiamo stampa i numeri da uno a 10 uno sotto l'altro.
var k = 0
while(k<10)
{
println(k+1)
k++
}
In cui l'output è
1
2
3
4
5
6
7
8
9
10
Vediamo quest'altro esempio:
while (false) println ("Questa istruzione non verrà mai eseguita.")
Come dice la stringa, la suddetta istruzione non verrà mai eseguita. Ma visto che la variabile k non viene mai usata la posso non dichiarare? Certo, come nell'esempio sottostante, ma prima ricordiamo che non ha molto senso scrivere un ciclo while come quello appena descritto, e generalmente viene segnalato in fase di compilazione con un messaggio del tipo "Statement not reached". In maniera del tutto analoga è possibile definire un ciclo infinito, ovvero un ciclo che manda il processo in loop:
while (true) println ("Questo è un ciclo senza uscita!")
A differenza dei cicli che non vengono mai eseguiti a volte si fa uso dei cicli infiniti, per il semplice motivo che in realtà... non sono infiniti! Esiste infatti la possibilità di interrompere l'esecuzione di un ciclo dall'interno inserendo un comando nel corpo del ciclo. Osservate l'esempio di seguito il cui output è analogo a quello di uno degli esempi presentati in precedenza:
var k = 0
while(true)
{
k++
if(k==5) continue
println(k)
if(k==10) break
}
L'output è
1
2
3
4
6
7
8
9
10
Si ha saltato il numero 5, perché l'istruzione continue dice di saltare il codice sottostante se k è uguale a 5 ed esce dal ciclo se k è uguale a 10.
Le istruzioni di break e continue sono consentite anche nel ciclo for. Inoltre se si dispone di cicli annidiati, è possibile contrassegnare le istruzioni del ciclo con una annotazione e specificare la suddetta annotazione nelle istruzioni di break e continue:
outer@ for(i in 0..10) {
inner@ for(j in 0..10) {
break // Will break the inner loop
break@inner // Will break the inner loop
break@outer // Will break the outer loop
}
}