¿Hay alguna diferencia entre usar for (;;) y while (1)?


Respuesta 1:

En términos del código generado, cualquier compilador de C moderno debería darle los mismos resultados.

Los autores, el profesor y otros que dicen que for (;;) genera más gastos generales ya sea (a) no saben de qué están hablando o (b) están trabajando con compiladores antiguos o rotos. for (;;) no genera sobrecarga adicional, porque no hay condición ni escalonamiento de una variable de bucle. En todo caso, mientras que (1) en un antiguo compilador no optimizador en realidad podría producir más sobrecarga, ya que verifica alegremente si 1 no es cero en la parte superior de cada iteración. Los compiladores modernos no harán esto.

En algunas implementaciones del compilador, si sube los niveles de advertencia lo suficientemente alto o usa una utilidad similar a pelusa, puede recibir una advertencia en while (1), o su equivalente, que dice que algo como la expresión condicional es constante. for (;;) no genera tal advertencia, porque no hay ninguna expresión condicional en absoluto. He trabajado en proyectos en los que queríamos compilar con cero advertencias y, por lo tanto, elegí usar para (;;) en lugar de un equivalente de tiempo (1). Además, for (;;) puede ser más fácil de buscar que las variantes while.

Por cierto, si vas a usar while, se considera más legible decir:

mientras (cierto)

que decir:

mientras que (1)

a pesar de que el primero requiere más tipeo.

En la C moderna (es decir, desde C99 en 1999), no debería crear su propia versión de TRUE. En su lugar, incluya el archivo de encabezado stdbool.h, y tendrá acceso al tipo de datos bool definido (en lugar de tener que usar la palabra clave _Bool) y los símbolos verdadero y falso. Rodar sus propios valores verdaderos / falsos es tan ...

... 1998.


Respuesta 2:

El estándar: estándar C ++

6.5.3 La instrucción for1 La instrucción for para (instrucción for-init-conditionopt; expressionopt) es equivalente a [código] {for-init-instrucción while (condición) {instrucción de declaración; }} [/ code] excepto que los nombres declarados en la instrucción for-init están en la misma región declarativa que los declarados en la condición, y excepto que una instrucción continue in (no incluida en otra instrucción de iteración) ejecutará una expresión antes de re -condición de evaluación. [Nota: Por lo tanto, la primera instrucción especifica la inicialización para el ciclo; la condición (6.4) especifica una prueba, realizada antes de cada iteración, de modo que el bucle salga cuando la condición se vuelva falsa; la expresión a menudo especifica el incremento que se realiza después de cada iteración. - nota final] 2 Se puede omitir una o ambas condiciones y la expresión. Una condición faltante hace que la cláusula while implícita sea equivalente a while (verdadero).

Tal vez


Respuesta 3:

Cualquier compilador que valga la pena generará un código idéntico en ambos casos.

Una posible preferencia por la opción for (;;) es que algunas (¿muchas?) Personas consideran que es "estilo pobre" usar constantes numéricas en el código. Es decir, no escribes

x + = 10;

pero tu escribes

static const int my_constant_value = 10;

(...)

x + = my_constant_value;

La razón es que tener todas las constantes numéricas declaradas explícitamente (y preferiblemente al comienzo del archivo fuente, en lugar de extenderse por todo el archivo) da como resultado un código más fácil de mantener.

Obviamente no hace ninguna diferencia con respecto a (;;) vs while (1), pero ver un '1' en un código libre de números sigue siendo incómodo.

En C ++ (y, desde C99, también en C) podemos escribir "while (verdadero)", pero eso es incluso más largo que "while (1)", que en sí mismo es más largo (por 1 carácter) que "for (;;) ".