Qual è il modo corretto per convertire da un ciclo for per un ciclo while?

voti
1

Ho un ciclo for della forma:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}

E voglio convertirlo in un ciclo while (soprattutto perché voglio giocare con il valore iall'interno del ciclo di andare avanti e indietro e il mio collega pensa che facendo questo in un ciclo for è soggetto a problemi. Io tendo a d'accordo con lui). Così ho scritto qualcosa di simile:

int i = from;
while (i < to) {
  try {
    // do some code (I don't know exactly what, it is subject to change)
  } finally {
    i++;
  }
}

Che hanno spinto alcuni alcuni commenti ad alta voce. Il mio ragionamento è che non si sa che cosa il codice all'interno del ciclo lo fa - si può (e lo fa) avere più continuecomandi.

In risposta ha scritto questo:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}

Certo le sue linee meno, ma penso ancora che il mio codice è più elegante - cosa ne pensi?

È pubblicato 03/11/2009 alle 18:26
fonte dall'utente
In altre lingue...                            


6 risposte

voti
3

E voglio convertirlo in un ciclo while (soprattutto perché voglio giocare con il valore dei all'interno del ciclo di andare avanti e indietro e il mio collega pensa che facendo questo in un ciclo for è soggetto a problemi. Tendo d'accordo con lui).

Questo è perfettamente accettabile nella maggior parte delle lingue. Non v'è alcuna ragione per evitare un ciclo for.

Risposto il 03/11/2009 a 18:30
fonte dall'utente

voti
5

Giocando con il valore del tuo indice mentre in una struttura di ciclica è soggetto a problemi, non importa quale sia la struttura loop è .

Non sta andando alla materia se si tratta di un ciclo for o di un ciclo while, il punto è sarà l'indicizzatore fine vi porterà a prendere una decisione di cessazione del ciclo?

Se siete sicuri che sei indicizzatore finirà per causare la sua condizione di uscita da raggiungere, allora questo è tutto quello che dovrebbe occuparsi, non se utilizzare un favore o un po '.

Risposto il 03/11/2009 a 18:31
fonte dall'utente

voti
0

Il modo più semplice per farlo sarebbe quello di non convertire in un ciclo while, come qui di seguito.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Risposto il 03/11/2009 a 18:33
fonte dall'utente

voti
2

Mi sembra che possa essere più facile e più leggibile per convertirlo in:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}

e quindi separare la chiusura del loop dal incrementazione variabile.

Se vedo un ciclo con un controllo del limite (ad esempio i < limit) avrei tendono ad assumere che c'è una variabile che viene modificato in un (ragionevolmente) modo coerente. Non c'è alcun motivo per cui non si può fare ciò che si vuole, ma mi sarebbe inclinarsi verso il comportamento più leggibile e più attesi.

Risposto il 03/11/2009 a 18:34
fonte dall'utente

voti
0

Per rispondere alla domanda su quale codice vorrei scegliere; Scelgo il codice più a lungo. La sua molto più facile da leggere il primo (più lungo) ciclo. E sì che posso leggere il secondo, ma anche se si hanno un sacco di esperienza che si deve guardare due volte per sapere che cosa quel ciclo fa. Inoltre il compilatore di ottimizzare il codice abbastanza bene.

Risposto il 03/11/2009 a 18:35
fonte dall'utente

voti
1

Perché perdere tempo con cicli stupidi quando si può fare lo stesso (e molto altro!) Con la super-potente goto?

i = fro;
my_loop:
//all your stuff here
i++;
if (i < to) goto my_loop;

Se siete uno di quei programmatori deboli di cuore che diminuiscono la goto, allora si può provare con questo:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Risposto il 03/11/2009 a 18:38
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more