¿Cuál es la forma correcta de convertir de un bucle for a un bucle while?

votos
1

Tengo un bucle for del formulario:

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

Y quiero convertirlo en un ciclo while (sobre todo porque quiero jugar con el valor de identro del ciclo para ir hacia atrás y hacia adelante y mi compañero de trabajo piensa que hacer esto en un ciclo for es propenso a los problemas. Tiendo a de acuerdo con él). Entonces escribí algo como esto:

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

Lo cual provocó algunos comentarios ruidosos. Mi razonamiento es que no sabes lo que hace el código dentro del ciclo, puede (y tiene) tener varios continuecomandos.

Como respuesta, él escribió esto:

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

Admito que tiene menos líneas, pero aún creo que mi código es más elegante, ¿qué opinas?

Publicado el 03/11/2009 a las 18:26
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
3

Y quiero convertirlo en un ciclo while (sobre todo porque quiero jugar con el valor de i dentro del ciclo para ir hacia atrás y hacia adelante y mi compañero de trabajo piensa que hacer esto en un ciclo for es propenso a problemas. para estar de acuerdo con él).

Esto es perfectamente aceptable en la mayoría de los idiomas. No hay razón para evitar un bucle for.

Respondida el 03/11/2009 a las 18:30
fuente por usuario

votos
5

Jugar con el valor de su índice mientras está en una estructura de bucle es propenso a problemas, sin importar cuál sea la estructura de bucle .

No va a importar si se trata de un bucle for o un loop while, el punto es si el indexador eventualmente lo llevará a tomar una decisión de terminación de bucle.

Si confía en que su indexador eventualmente hará que se logre su condición de salida, entonces eso es todo lo que debería preocuparle, no si usará por un tiempo o por un tiempo.

Respondida el 03/11/2009 a las 18:31
fuente por usuario

votos
0

La forma más fácil de hacer esto sería no convertir en un ciclo while, como a continuación.

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
Respondida el 03/11/2009 a las 18:33
fuente por usuario

votos
2

Me parece que puede ser más fácil y más legible convertirlo a:

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

y así separar la terminación del bucle del incremento de la variable.

Si veo un ciclo con una verificación de límite (por ejemplo i < limit), tendería a suponer que hay una variable que se está modificando de una manera (razonablemente) consistente. No hay ninguna razón por la cual no puedas hacer lo que quieras, pero me inclinaría por el comportamiento más legible y más esperado.

Respondida el 03/11/2009 a las 18:34
fuente por usuario

votos
0

Para responder la pregunta sobre qué código seleccionaría; Elijo tu código más largo Es MUCHO más fácil de leer el primer ciclo (más largo). Y sí, puedo leer el segundo, pero incluso si tienes mucha experiencia, debes mirar dos veces para saber qué hace ese ciclo. Además, el compilador optimizará el código lo suficientemente bien.

Respondida el 03/11/2009 a las 18:35
fuente por usuario

votos
1

¿Por qué molestarse con bucles tontos cuando puede hacer lo mismo (y mucho más) con el súper poderoso goto?

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

Si eres uno de esos programadores de corazón débil que disminuyen el goto, entonces puedes probar con esto:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}
Respondida el 03/11/2009 a las 18:38
fuente por usuario

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