Domanda

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 del i 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 ad essere 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 ha indotto alcuni alcuni commenti ad alta voce. Il mio ragionamento è che non si sa che cosa il codice all'interno del ciclo fa -. Si può (e lo fa) hanno più comandi continue

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)
}

concesso il meno linee, ma io continuo a pensare il mio codice è più elegante - cosa ne pensi?

È stato utile?

Soluzione

  

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 ad essere d'accordo con lui).

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

Altri suggerimenti

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

Non è intenzione importa 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 ciclo?

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

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 cessazione del ciclo dal Incremento variabile.

Se vedo un ciclo con un controllo del limite (ad esempio i < limit) Tenderei supporre 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.

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

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 il goto, allora si può provare con questo:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}

Il modo più semplice per farlo sarebbe quello di non convertire in un ciclo while, come 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;
}

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top