Argomenti trattati: sintassi dell'istruzione ciclica while.
Il ciclo while è un ciclo condizionato per cui qualsiasi risultato derivante da un'espressione logica può fungere da condizione di fine. La sintassi di while è molto semplice:
while(condizione) {
istruzioni;
}
Come nel caso di for tutte le istruzioni che si trovano comprese fra le parentesi graffe vengono ripetute fino a che la condizione di fine ciclo non risulta vera. Si osservi il seguente listato di esempio:
<html>
<title>Il ciclo while</title>
<head>
<script language="JavaScript">
<!--
//Questo ciclo proseguirà fino a che bool sarà "true"
var bool=true, cont=0;
while(bool) {
alert('bool è: ' + bool + '\n' + 'Valore di cont: ' + cont);
cont++;
if (cont==10) bool=false;
}
alert('Ora bool è: ' + bool + '\n' + 'cont vale: ' + cont);
-->
</script>
</head>
Il ciclo mostrato nell'esempio basa la propria esecuzione sul valore booleano della variabile bool. Il listato è molto simile a quello del quarto esempio utilizzato nel capitolo sul ciclo for con l'unica differenza che il ciclo in questo caso continuerà la propria esecuzione fino a che la variabile bool sarà impostata a true mentre nel primo caso accadeva l'esatto contrario. Questa è solo una scelta arbitraria del programmatore e non ha nulla a che fare con la natura dei due cicli; si sarebbe potuto fare l'opposto e sarebbe stata la stessa identica cosa.
Per provare il listato d'esempio premere il pulsante qui sotto.
Apparirà evidente come, in sostanza, i due cicli siano equivalenti e non vi siano dei casi specifici in cui è obbligatorio l'utilizzo di uno piuttosto che dell'altro. Certamente il ciclo for è meglio strutturato per eseguire cicli a conteggio ma cosí come abbiamo visto essere possibile il suo utilizzo anche con condizioni di fine che si basano su risultati di espressioni booleane, allo stesso modo è possibile utilizzare il ciclo while con una condizione di fine che si basa su una variabile contatore, come mostrato nell'esempio seguente.
<html>
<title>While con contatore</title>
<head>
<script language="JavaScript">
<!--
//Questo ciclo proseguirà fino a che cont sarà minore di 10
cont=0;
while(cont<10) {
alert('Valore di cont: ' + cont);
cont++;
}
alert('Ora cont vale: ' + cont);
-->
</script>
</head>
Ciò che rende preferibile, in un caso del genere, ricorrere all'utilizzo del ciclo for piuttosto che a quello di while è solo il diverso modo in cui sono strutturati; come abbiamo visto, in for è possibile dichiarare e inizializzare una variabile contatore nel corpo stesso del ciclo, tra le parentesi tonde, e la stessa cosa è possibile fare con gli incrementi e i decrementi della variabile contatore. Ciò rende il codice piú sintetico e meglio leggibile ma non ha alcuna influenza dal punto di vista funzionale.
Naturalmente anche il ciclo while può essere annidato. L'esempio qui sotto riprende il settimo esempio già visto con il ciclo for e lo "traduce" nella sintassi di while.
<html>
<title>Cicli while annidati</title>
<head>
<script language="JavaScript">
<!--
var stringa='', x=0, y=0;
while (x<10) {
while (y<10) {
stringa+='(' + x + ',' + y + ')' + ' ';
y++;
}
stringa+='\n';
y=0;
x++;
}
alert(stringa);
-->
</script>
</head>
L'unica, sostanziale differenza tra questo codice e quello visto con il ciclo for è che qui bisogna preoccuparsi di riazzerare la variabile y in modo che al secondo "giro" di x, y si trovi a zero e possa cominciare un nuovo ciclo. Se ci si dimenticasse di azzerare la variabile del ciclo piú annidato il ciclo di y verrebbe eseguito solo 10 volte e l'output mostrerebbe una sola riga di coordinate. Da questo particolare non secondario risulta chiaro come, in caso di necessità di esecuzione di cicli a conteggio, sia senz'altro da preferirsi l'utilizzo di for visto che dispone di una sezione di dichiarazione e di inizializzazione delle variabili e di conseguenza, una volta dichiarato il valore iniziale di una variabile, il suo azzeramento diventa automatico alla successiva iterazione del ciclo.
Il codice del listato qui sopra produrrà un output identico a quello dell'analogo esempio visto con il ciclo for.
Per dimostrare quanto appena detto piú sotto viene mostrato il codice sbagliato in cui viene omesso volutamente il riazzeramento della variabile y.
<html>
<title>Cicli while annidati</title>
<head>
<script language="JavaScript">
<!--
var stringa='', x=0, y=0;
while (x<10) {
while (y<10) {
stringa+='(' + x + ',' + y + ')' + ' ';
y++;
}
stringa+='\n';
x++;
}
alert(stringa);
-->
</script>
</head>
Cliccando sul pulsante qui sotto si otterrà l'output errato.
Come for anche while può avere condizioni multiple che ne regolano l'esecuzione, sempre con l'utilizzo degli operatori logici AND e OR. In proposito si veda l'esempio seguente:
<html>
<title>Ciclo while a condizione multipla</title>
<head>
<script language="JavaScript">
<!--
var a=0, b=20;
while (a!=10 || b!=10) {
a++;
b--;
alert('a vale:' + a + '\n' + 'b vale: ' + b);
}
alert('Valore di a alla fine del ciclo: ' + a + '\n' + 'Valore di b alla fine del ciclo: ' + b);
-->
</script>
</head>
Il codice d'esempio è molto simile a quello usato per il sesto esempio del ciclo for ma mentre in quel caso si è usato l'operatore AND per impostare la condizione di fine ciclo, in questo esempio si è ricorso all'utilizzo di OR. In questo caso il ciclo prosegue fino a quando entrambe le variabili sono diverse da 10 e termina quando ambedue raggiungono quota 10.
L'utilizzo del ciclo while non pone particolari problemi; esso risulta molto utile quando ci si deve basare su una condizione di fine che deriva da un'espressione logica, e che non richiede parametri aggiuntivi come contatori o altre variabili. In tali casi è preferibile usare il ciclo while piuttosto che un ciclo for con parti mancanti, anche se è una preferenza esclusivamente "stilistica" piú che funzionale. Il linguaggio JavaScript possiede un'altra variante del ciclo while che però si discosta da quella appena vista per un particolare fondamentale che la fa classificare come un tipo di ciclo totalmente distinto. È ciò che vedremo nella trattazione del ciclo do... while.