Descargo de responsabilidad: traté de buscar una pregunta similar, sin embargo, esto volvió sobre cada pregunta en C++ ... También agradecería a cualquiera que pueda sugerir un título mejor.Directriz: while vs for
Hay dos estructura de bucle eminente en C++: while
y for
.
- propósito que disolver la relación de
do ... while
, es una especie de paralelo - Sé de
std::for_each
yBOOST_FOREACH
, pero no cada bucle es unafor each
Ahora, puedo ser un poco estrecho, pero siempre me pica a correcta código así:
int i = 0;
while (i < 5)
{
// do stuff
++i; // I'm kind and use prefix notation... though I usually witness postfix
}
y transformarla en:
for (int i = 0; i < 5; ++i)
{
// do stuff
}
Las ventajas de for
en este ejemplo son múltiples, en mi opinión:
- Localidad: la variable i sólo vive en el ámbito del bucle
- Pack: el 'control' de bucle está empaquetado, por lo que solo mirando la declaración de bucle puedo determinar si está formado correctamente (y terminará ...), suponiendo, por supuesto, que la variable de bucle no está más m odified dentro del cuerpo
- Puede ser inline, aunque no siempre habría aconsejado (que hace que para los insectos difíciles)
tengo una tendencia, por tanto, no utilizar while
, excepto tal vez para el while(true)
idioma pero eso es no es algo que haya usado en mucho tiempo (juego de palabras). Incluso para las complicadas condiciones que tienden a pegarse a una construcción for
, aunque en varias líneas:
// I am also a fan of typedefs
for (const_iterator it = myVector.begin(), end = myVector.end();
it != end && isValid(*it);
++it)
{ /* do stuff */ }
Usted puede hacer esto con un while
, por supuesto, pero entonces (1) y (2) no se puede verificar.
Me gustaría evitar las observaciones "subjetivas" (del tipo "Me gusta para/mientras mejor") y definitivamente me interesan las referencias a las normas de codificación/estándares de codificación existentes.
EDITAR:
que tienden a quedarse realmente a (1) y (2) la medida de lo posible, (1), ya que se recomienda localidad >>C++ Coding Standards: Item 18, y (2), ya que hace más fácil el mantenimiento si no tengo que escanear un bucle de cuerpo entero para buscar posibles alteraciones de la variable de control (que doy por hecho usando un for
cuando la tercera expresión hace referencia a las variables de bucle).
Sin embargo, como gf
mostrados abajo, mientras que sí tienen su uso:
while (obj.advance()) {}
Tenga en cuenta que esto no es una diatriba contra while
sino más bien un intento de encontrar el que uno de while
o for
uso dependiendo del caso a la mano (y por razones de sonido, no solo me gusta).
Sí. Esto se debe a que el ciclo "para" C/C++ es realmente un ciclo while con azúcar sintáctica para inicialización, prueba e incremento. Históricamente (FORTRAN, Algol, Pascal, ...) el bucle for ha sido puramente para la indexación: 'para i: = 1 paso 2 hasta que N haga '. No es así en C, donde el compilador también ha saltado a través de aros de análisis de flujo de datos adicionales para descubrir que esa era su intención. – bendin
no olvide que las variables de inicialización dentro de la estructura 'para' no cumplen con la codificación ansi. por lo que para (int i = 0; etc.) no es compatible, pero int i; for (i = 0; etc.) es. Esa es mi comprensión :) – theraven
@theraven: ¿Podrías señalarme esto? Definitivamente estoy interesado si existe un riesgo de portabilidad ya que mi código generalmente se compila tanto en Unix como en Windows. –