Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Come si sceglie se usare un ciclo for o while?

989 views
Skip to first unread message

Jamie

unread,
Feb 14, 2012, 5:16:44 AM2/14/12
to
Questa volta non vi chiederò codicillo da quattro soldi :-)
Mi stavo chiedendo voi in base a quale criterio scegliete se usare un
ciclo for, un ciclo while o addirittura do/while?
Non riesco ancora ad apprezzarne bene le differenze.
So che for dà il vantaggio di una gestione unitaria e semplificata della
variabile di controllo dell'iterazione...ma c'e' altro che val la pena
considerare?

Grazie.
J

Quasimodo

unread,
Feb 14, 2012, 5:24:19 AM2/14/12
to
for : quando il numero di iterazioni è noto e non c'è necessità di dover
interrompere il ciclo;

do: quando devi fare *almeno una* iterazione e non sai a priori quante
ne farai;

while: quando potresti avere zero iterazioni e non sai a priori quante
ne farai;

In ogni caso i tre costrutti sono sempre intercambiabili, previa
opportuna contorsione del codice!

Andrea D'Amore

unread,
Feb 14, 2012, 5:33:51 AM2/14/12
to
In article <4f3a348e$0$1386$4faf...@reader2.news.tin.it>,
Jamie <ja...@bluesky.no> wrote:

> Mi stavo chiedendo voi in base a quale criterio scegliete se usare un
> ciclo for, un ciclo while o addirittura do/while?
> Non riesco ancora ad apprezzarne bene le differenze.

In linea di massima dipende se vuoi fare il controllo prima o dopo il
ciclo, o se sai in anticipo quante volte vuoi fare il ciclo.

Troppi problemi comunque, se per te non c'è differenza sai già come
procedere: usane uno qualsiasi.
Eventualmente dovessi capire in un secondo momento che un altra
struttura andava meglio, allora la cambierai.

Jamie

unread,
Feb 14, 2012, 6:20:53 AM2/14/12
to
On 14/02/2012 11:24, Quasimodo wrote:

> for : quando il numero di iterazioni è noto e non c'è necessità di dover
> interrompere il ciclo;

ma se ci fosse la necessita' di interrompere il ciclo non si puo' usare
il break?

> do: quando devi fare *almeno una* iterazione e non sai a priori quante
> ne farai;
>
> while: quando potresti avere zero iterazioni e non sai a priori quante
> ne farai;

> In ogni caso i tre costrutti sono sempre intercambiabili, previa
> opportuna contorsione del codice!

contorsione?

ciao e grazie


Dr.Ugo Gagliardelli

unread,
Feb 14, 2012, 6:50:01 AM2/14/12
to
il 14.02.2012 11:16, Scrive Jamie 121626976:
Grosso modo, chi decide e' la preferenza del programmatore, nel senso
che i tre metodi possono funzionare allo stesso modo, dipendentemente da
come li condizioni. Ad esempio i tre costrutti che seguono si comportano
allo stesso modo:
for(;;) {}
while(true) {}
do {} while(true);
Mentre il l'iterazione for puo' sostituire sia il do che il while, la
differenza tra do e while e' che nel do la condizione di controllo viene
valutata alla fine di ogni ciclo, mentre nel while all'inizio.

S'intende che tutte tre le iterazioni possono essere controllate con
break; e continue;.
Per iterazioni semplici, dove ad esempio una variabile di controllo non
e' strettamente necessaria, io preferisco il while. Ad esempio:
List<String> lista;
Iterator<String> iterator = lista !=null?lista.iterator():null;

for(;iterator !=null && iterator.hasNext();) {
String elemento = iterator.next();
}

analogamente col while;

while(iterator !=null && iterator.hasNext()) {
String elemento = iterator.next();
}


Ovviamente una visione ampia del linguaggio e delle classi che usi ti
aiuta in queste decisioni.

Ti segnalo anche l'iterazione for-each (introdotta nel linguaggio java a
partire, direi, dalla 1.5), che funziona con gli array e con le classi
che implementano java.lang.Iterable, ovvero le classi che implementano
il metodo iava.util.Iterator iteretor();
Appartengono a questo gruppo di classi tutte le Collection. L'uso e'
molto semplice:


for(String elemento: lista) {
}

che equivale all'iterazione di tutti gli elementi della lista,
esattamente come negli esempi sopra, ma funziona anche se lista e' un
String[].

ReadOnly

unread,
Feb 14, 2012, 8:42:50 AM2/14/12
to
Il 14/02/2012 12:20, Jamie ha scritto:
>> In ogni caso i tre costrutti sono sempre intercambiabili, previa
>> opportuna contorsione del codice!
>
> contorsione?

Per passare da un for....

for(int i=0; i<getSize(); i++){
doSomething(getElement(i));
}

...ad un while devi solo spostare un po' di cose.

int i=0;
while(i<getSize()){
doSomething(getElement(i));
i++;
}

Le due sono perfettamente equivalenti. Nello specifico perň la seconda č
un po' meno leggibile: col for sulla stessa riga sapevi come iniziava,
quando finiva, come ci arrivava. Qui i tre elementi sono un po'
sparpagliati e se il ciclo fosse bello lungo sarebbe anche peggio.

Se poi usi il do..while devi anche tenere in considerazione che la
condizione viene esaminata *dopo* il ciclo, quindi almeno una volta ci
entra:

int i=0;
do {
doSomething(getElement(i));
i++;
} while(i<getSize());

ora immagina che getSize restituisca 0 e che getElement lanci sempre
eccezione in questo caso. Con for e while nessun problema. Con do..while
dovresti come minimo aggiungere un controllo dentro al ciclo che
verifica la condizione anomala.

Piccola nota personale: giurerei di non aver mai usato un do..while
negli ultimi 5 anni. Forse di piů...

--
r--r--r--

rootkit

unread,
Feb 14, 2012, 5:48:45 PM2/14/12
to
l'utilizzo di questi tre costrutti (a cui si potrebbe aggiungere anche
il foreach) dipende in buona parte dallo stile di programmazione, per
cui non starei tanto a scervellarmi per capire se mi sfugge qualcosa.
l'importante è aver capito come funzionano, poi a parte qualche
situazione classica è una questione di stile di programmazione
tecnicamente poco rilevante. io ad esempio uso quasi sempre il while
anche quando magari qualcun altro farebbe in altro modo.



Jamie

unread,
Feb 15, 2012, 3:37:00 AM2/15/12
to
On 14/02/2012 23:48, rootkit wrote:

> l'utilizzo di questi tre costrutti (a cui si potrebbe aggiungere anche
> il foreach) dipende in buona parte dallo stile di programmazione, per
> cui non starei tanto a scervellarmi per capire se mi sfugge qualcosa.
> l'importante è aver capito come funzionano, poi a parte qualche
> situazione classica è una questione di stile di programmazione
> tecnicamente poco rilevante. io ad esempio uso quasi sempre il while
> anche quando magari qualcun altro farebbe in altro modo.

Ok grazie. Volevo solo capire se c'era qualche motivo di ordine pratico
per preferire uno all'altro, insomma volevo sentire la voce
dell'esperienza...
Un'altra domanda, sempre sui cicli.
Prendendo ad esame questo frammento di codice:
http://img696.imageshack.us/img696/9911/while.jpg

secondo la slide e' un ciclo che viene eseguito all'infinito perche' la
variabile contatore del ciclo "esterno" non arriva mai a soddisfare la
condizione di stop.
Quel che mi chiedo e'...pero' quella del ciclo interno a un certo punto
si interrompe, allora perche' la stringa "here" viene stampata comunque
infinite volte?
Il ciclo esterno e' infinito ma quando il ciclo interno arriva alla fine
non dovrebbe il ciclo esterno smettere comunque di stampare here? Ecco,
non capisco perche' l'interruzione del ciclo interno non comporta anche
l'interruzione di quello esterno, perche' di fatto quello esterno e'
infinito ma continuerebbe a ciclare cosa?

Quasimodo

unread,
Feb 15, 2012, 3:50:23 AM2/15/12
to
Perché il ciclo interno finisce, dopo 30 iterazioni, ma quello esterno
no, quindi la variabile count2 viene reinizializzata a 1 e il ciclo
interno ricomincia...
La stampa "Here" avviene sempre nel ciclo interno, mai in quello esterno.


Jamie

unread,
Feb 15, 2012, 7:29:19 AM2/15/12
to
On 15/02/2012 09:50, Quasimodo wrote:

> Perché il ciclo interno finisce, dopo 30 iterazioni, ma quello esterno
> no, quindi la variabile count2 viene reinizializzata a 1 e il ciclo
> interno ricomincia...

ah ecco, mi era sfuggita la riga di re-inizializzazione della variabile
count2

grazie
0 new messages