Newsgroup: it.comp.lang.c++
Titolo: Re: Differenza fra cicli...

> Però se esiste il while ci sarà pure un motivo....
Ummm, interessante...
io so che:
for( expr1; expr2; expr3 )
    stant;
e` assolutamente equivalente a:
expr1;
while( expr2 )
{
    stant;
    expr3;
}
Quindi IMHO, e` solo una questione di stile ed eleganza di programmazione,
il ciclo for, secondo me, si presta piu` ai casi di iterattivita` con
incremento e controllo di una variabile (tipicamente int i,j...) e in questi
casi risulta piu` sintetico o comunque in meno righe... il ciclo while per
gli altri casi e anche per i cicli infiniti ( while(1) )...
Se non ricordo male questa e` un po' la concezione del linguaggio FORTRAN o
forse del PASCAL e quindi potrebbero esserci anche ragioni storiche...
Boh, vediamo cosa dicono gli altri...

 Grazie.
De ke? :-D
-- 
Axel
Mods of Cropcirclecrew
Sezione Programmazione Domande/Risposte
http://www.cropcirclecrew.org/public/cccforum/index.php
 

 Però se esiste il while ci sarà pure un motivo....
Ciao, effettivamente il for ed il while hanno molto in comune e il loro uso
è sovrapponibile.
Entrambe testano la condizione all'inizio dell'iterazione e da questo punto
di vista il ciclo differente è do/while.
Il while sembrerebbe un caso particolare di for.
Quest'ultimo è comunque più flessibile e potente perché riesce a impostare
la dichiarazione e l'inizializzazione all'inizio del ciclo e a definire una
serie di istruzioni fra un ciclo e l'altro, oltre che il testing della
condizione di ciclo.
Chiaramente un for(;;condizione) è simile a un while(condizione).
Io solitamente utilizzo while quando la condizione è su una variabile che è
dichiarata esternamente al ciclo stesso, es.
int variabile;
...
while( test su variabile)
e non è possibile fare altrimenti, capita a volte, e usare la formula
for(;;test su variabile) pur se equivalente mi piace poco stilisticamente.
Preferisco usare for ogni volta che posso utilizzare un contatore o un
iteratore che interessa soltanto al ciclo oppure conosco esattamente dove un
ciclo inizia e dove finisce, ad esempio:
for(int i=0;i<10;++i)
dove i inizia e finisce nel ciclo, oppure
for(vector<int>::iterator it=v.begin();it!=v.end();++it)
mi sembra migliore di
vector<int>::iterator it=v.begin();
while(it!=v.end())
{
    fa_qualcosa();
    ++it;
}
se non è necessario definire it fuori dal ciclo.
Comunque ognuno fa come ritiene opportuno.
ciao,
Paolo.

 Però se esiste il while ci sarà pure un motivo....
Stiamo lavorando (per esempio) con una lista concatenata standard, o con
un albero...
while (iter->next != NULL)
while (node->right != NULL)
e simili sono abbastanza frequenti.
-- 
RiK0
[ non credo negli schemi non vincenti ]
[     two is an odd prime number.     ]

 e simili sono abbastanza frequenti.
Beh, se vogliamo potresti anche usare un for:
for( tmp_ptr = testa; tmp_ptr; tmp_ptr = tmp_ptr->next )
parti dalla testa, se non e' null esegui il codice, poi ti sposti alla
posizione dopo, se non e' null esegui il codice etc....
Non hai fatto il migliore degli esempi, ma capisco quello che volevi dire.
Credo pero' che intendesse che ogni while puo' essere traformato in un for
secondo la seguente regola:
while( condizione ){
}
for( ; condizione ; ){
}
e per questo definiva il ciclo for come "universale".
D'altro canto pero', se vogliamo fare il discorso opposto, anche il while e'
universale:
for(int i=0; i<10; ++i){
     // corpo
}
puo' essere definito come:
{
     int i = 0;
     while(i<10){
           // corpo
           ++i;
     }
}
Ok, e' macchinoso, ma, in sostanza while e for definiscono la stessa cosa:
un ciclo. Per questo sono interscambiabili.
Quindi possono essere utilizzati entrambi in in tutte le condizioni che
richiedono un ciclo. Per alcune condizioni il while e' piu' naturale, per
altre lo e' un for.
Poi ci sono questioni di gusti tipo:
while(1){
}
o
for( ; ; ){
}
io sono piu' per la seconda, ma molti preferiscono la prima.
Volendo si puo' fare anche l'orribile:
for( ; 1 ; ){
}
ma e' da vomito ;-)
Tuttavia e' equivalente.
Il for certamente e' quello che presenta piu' opzioni, ma non e' sempre la
scelta migliore, piu' naturale ed elegante.
Tommy

 scelta migliore, piu' naturale ed elegante.
Anche a me piace piu` il for. E sono pure d'accordo sulla loro quasi
totale interscambiabilita` in C++ o in C.
In altri linguaggi invece sono costrutti ben diversi (posto che comunque
si puo` fare a meno dell'uno o dell'altro, diciamo che il for e`
estremamente piu` comodo).
Penso specialmente al Python, dove davvero il for e` su un altro pianeta
rispetto al while (ed effettivamente buona parte delle nuove features
sono state introdotte per minimizzare l'uso dei while, 'poco chiari'
secondo BDFL).
-- 
RiK0
Non credo negli schemi non vincenti.

 }
Se non ricordo male l'unica effettiva differenza e' che se hai un "continue"
nel while, questo ovviamente non eseguira' l'incremento di i, mentre il for
si.
-- 
giuseppe

 Però se esiste il while ci sarà pure un motivo....
Puoi scrivere while(exp) { } oppure do { } while(exp); la differenza
sta nel fatto che exp viene valutata prima o dopo la esecuzione dello
statement, cioè nell'ordine in cui lo stai leggendo.
Il for non lo trovo tanto intuitivo: for (a;b;c) d; esegue
a b d c b d c ... ma è una personale preferenza :-)
-- 
alef

