Estas bucles for
se encuentran entre los primeros ejemplos básicos de pruebas formales de corrección de algoritmos. Tienen diferentes pero equivalentes condiciones de terminación:Condiciones de terminación de bucle
1 for (int i = 0; i != N; ++i)
2 for (int i = 0; i < N; ++i)
La diferencia se hace evidente en las condiciones posteriores:
El primero da la garantía fuerte que
i == N
después de que el ciclo termina.El segundo solo da la débil garantía de que
i >= N
termina el ciclo, pero se sentirá tentado a suponer quei == N
.
Si por alguna razón el incremento ++i
se cambia cada vez que algo así como i += 2
, o si i
es modificado dentro del bucle, o si N
es negativo, el programa puede fallar:
El el primero puede quedarse atascado en un ciclo infinito. Falla temprano, en el ciclo que tiene el error. La depuración es fácil.
El segundo ciclo finalizará, y en algún momento posterior el programa puede fallar debido a su suposición incorrecta de
i == N
. Puede fallar muy lejos del bucle que causó el error, lo que hace difícil rastrearlo. O puede continuar silenciosamente haciendo algo inesperado, lo que es aún peor.
¿Qué condición de terminación prefiere, y por qué? ¿Hay otras consideraciones? ¿Por qué muchos programadores que saben esto se niegan a aplicarlo?
Para aquellos que mencionaron que no estoy disponible fuera del, es útil tener en cuenta que el valor de i en la terminación se puede utilizar al razonar sobre programas. Por ejemplo, si desea establecer P (N) con un bucle que mantenga invariante P (i), entonces i == N le da P (N) mientras que i> = N no. – mweerden
+1 por una pregunta bien escrita que exprese claramente los méritos de cada opción. –