Pregunta

int n = 5;
for(int i = 0;i!=n;i++)//condition !=
{
//executing 5times
}

int n = 5;
for(int i = 0;i<n;i++)//condition <
{
//executing 5times

}

¿Cuál es el preferido?

  

Este fue un ejemplo de " C ++ acelerado   : programación práctica por ejemplo /   Andrew Koenig, Barbara E. Moo. & Quot; Sólo   quería saber por qué el autor prefiere   el primero

¿Fue útil?

Solución

El segundo. Por dos razones

  1. Cuanto menos (o a veces < =) es la forma habitual en que la mayoría de los codificadores escriben estos, y es mejor cumplir con la convención si es posible; ¡!! probablemente hará que la mayoría de los codificadores miren dos veces compruebe si hay algo extraño en el bucle mientras que < será entendido al instante.

  2. El! = depende de una condición exacta. Si el interior del bucle se modifica durante el mantenimiento e incrementé accidentalmente dentro del bucle, terminaría con un bucle infinito. En general, siempre es mejor hacer que su condición de terminación sea lo más amplia posible, simplemente es más robusta.

2 es, por supuesto, la razón por la cual 1.

Otros consejos

Yo diría < ya que captura un conjunto más amplio de condiciones. Suponga que n no es constante, sino que regresa de una función que en raras ocasiones devuelve -1. En ese caso, tendría un ciclo mucho más largo (¡hasta que int se ajuste a un valor -ve!) Con la versión! = Del ciclo.

Usar condition < es mucho mejor porque reduce la posibilidad de pasar por encima de su valor centinela y caer en un bucle infinito.

Como se indica en la pregunta, ambos bucles son equivalentes. Sin embargo, en el código real, es típico que las cosas sean un poco más complicadas, y en ese caso, el & Quot; i & Lt; n " La condición tiende a ser un poco más segura. Si, por ejemplo, pudiera aumentar en más de uno, podría pasar ny luego & Quot; i! = N & Quot; la versión daría como resultado un bucle eterno.

Este es un caso de programación defensiva. No se acepta universalmente: algunas personas prefieren asegurarse de que las cosas fallen tan espectacularmente como sea posible para que los errores se encuentren desde el principio. El estilo defensivo puede ocultar pequeños problemas como ese. Sin embargo, si desea atrapar todos los errores, también podría hacerlo:

int n = 5;
int i = 0;
while (i != n) {
    int old_i = i;
    // the real stuff of the loop here
   ++i;
   assert(i == old_i + 1);
}

(O, mejor aún, use un idioma que admita sintaxis para especificar condiciones previas y posteriores y los invariantes de bucle de forma nativa).

El libro " C Traps and Pitfalls " por Andrew Koenig (ver http://en.wikipedia.org/wiki/C_Traps_and_Pitfalls para empezar) probablemente sea interesante para usted si le gusta reflexionar sobre este tipo de preguntas.

Normalmente hago la segunda forma usando < ;. Pero pensar en usar! = Ya que los iteradores stl en c ++ funcionan de esta manera.

El segundo. Siempre se completará en algún momento (suponiendo que no estés haciendo nada divertido como jugar con el valor del contador dentro del bucle).

Nunca he visto el primer uso, al menos, no de esa manera.

<n es el más utilizado (mi opinión)

Prefiero usar < , ya que con solo mirar el código puedes ver que es un ciclo creciente, respalda el hecho de que estás usando i ++.

Si está utilizando i ++ y < y por alguna razón (otro codificador, error tipográfico, error humano) su código cambia el incremento a i-- sabría instantáneamente que el ciclo no se está evaluando, como con! = funcionará de cualquier manera, lo que lo hace menos trivial para depurar.

No puedo ver que importa, ¿no hay cosas más importantes de las que preocuparse?

Siempre uso el último, y eso es lo que más he visto.

Sin embargo, alguien seguramente me disparará ...

" i < n " es mejor. Porque si usas & Quot; i! = N & Quot; y en algunos casos su i inicial es mayor que n, ingresará un bucle infinito.

Creo que esta es una mejor alternativa si está optimizando para velocidad:

int n = 5;
for(int i = n;i > 0;i--)
{
//executing 5times
}

La razón de esto es que comparar con 0 es más rápido.

Digo que depende del tipo de la variable iteradora. Si sabes que es un número entero, usaría el segundo, porque puedes decir

  

Bucle, siempre que sea más pequeño que n

Que creo que es más fácil de leer para la mayoría de los programadores, incluido yo mismo. Si no conoce el tipo de variable iteradora, debe hacer la menor cantidad posible de suposiciones sobre sus capacidades. Es posible que operator< no esté disponible para i: si se trata de un iterador que no sea un iterador de acceso aleatorio, no se garantiza que operator!= esté disponible. En este caso, usaría <.

Evitaría preferir la opción <=> solo porque accidentalmente podría " pasar por encima de " El valor final. Creo que el argumento es defectuoso. Porque si accidentalmente dio un paso al frente, entonces eso es un error y debería notarse lo antes posible ( Fail -fast ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top