¿Es “for (;;)” más rápido que “while (TRUE)”? Si no, ¿por qué la gente lo usa?

164
for (;;) {
    //Something to be done repeatedly
}

He visto que este tipo de cosas se usan mucho, pero creo que es bastante extraño ... ¿No sería mucho más claro decir while(true) , o algo por el estilo?

Supongo que (como es la razón por la cual muchos programadores recurren al código críptico), ¿esto es un pequeño margen más rápido?

¿Por qué, y realmente vale la pena? Si es así, ¿por qué no simplemente definirlo de esta manera?

#define while(true) for(;;)

Ver también: ¿Cuál es más rápido: while (1) o while (2)?

Chris Cooper
fuente
51
¿Qué es TRUE?
AnT
20
@Steven Sudit: ¿Qué TRUEtiene que ver con C? La macro estándar para un verdadero resultado boolen en C99 sigue siendo true. ¿De dónde vino el TRUE?
ANT
31
Esa macro no funciona, #define EVER ;;aunque se ha utilizado en IOCCC .. :)
18
¿No es esa macro para #define while(TRUE)declarar una macro que toma un argumento llamado TRUEque nunca se usa, por lo tanto, convierte cada ciclo while en su programa en un ciclo infinito?
AshleysBrain
9
@Steven Sudit: No. No hay una "macro estándar en VS 6.0". La macro TRUEproviene de los archivos de encabezado asociados con la API de Windows. No está relacionado con VS 6.0 de ninguna manera. Y, como dije antes, no tiene nada que ver con C o C ++. En C ++, el literal "verdadero" es justo true(también en VS 6.0), en C89 / 90 no existe tal cosa, y en C99 es macro true. Esto se aplica a todos los compiladores C / C ++.
ANT

Respuestas:

262
  1. No es mas rapido.
  2. Si realmente te importa, compila con la salida del ensamblador para tu plataforma y mira para ver.
  3. No importa. Esto nunca importa. Escribe tus bucles infinitos como quieras.
Ben Zotto
fuente
227
Intuitivamente, la optimización de un bucle infinito ofrece el potencial para una aceleración infinita. Lo bueno es que no programamos en intuición, entonces. :-)
Steven Sudit
55
Supongo que tienes razón. Creo que estaba atrapado en debates "religiosos" sobre pequeñas cosas. Gracias por sacudirme la conciencia. : D
Chris Cooper
66
@Steven LOL, eso es interesante, pero luego considera que el único escenario en el que realmente alcanzaste ese potencial de aceleración infinita es cuando el bucle nunca se rompe y realmente funciona infinitamente, lo que probablemente sea un error o, si se pretende, será una espera infinita antes de alcanzar ese potencial.
AaronLS
77
@Chris. En la programación como en la vida, los debates religiosos solo valen la pena por las cosas que realmente importan. Esto simplemente no es una de esas cosas. Como puede ver, todos tienen una forma favorita de escribir un bucle sin fin. Elige por ti mismo lo que te haga más feliz por las pequeñas cosas, y luego ejecuta tu generador de perfiles en el código que importa. :)
Ben Zotto
3
Sí importó, ya que algunos de los primeros compiladores en algunas plataformas cargaron una constante e hicieron un salto condicional. Que en esos días el hardware sí importaba.
Peter
176

Prefiero for(;;)por dos razones.

Una es que algunos compiladores producen advertencias sobre while(true) (algo así como "la condición del bucle es constante"). Evitar las advertencias siempre es algo bueno.

Otra es que creo que for(;;)es más clara y más reveladora. Quiero un bucle infinito. Literalmente tiene no condición, no depende de nada. Solo quiero que continúe para siempre, hasta que haga algo para salir de eso.

Mientras que con while(true) , bueno, ¿qué tiene que ver algo con algo? No estoy interesado en hacer un bucle hasta que verdadero se convierta en falso, que es lo que esta forma literalmente dice (bucle mientras que verdadero es verdadero). Solo quiero hacer un bucle.

Y no, no hay absolutamente ninguna diferencia de rendimiento.

jalf
fuente
73
+1 para evitar advertencias. Pero en cuanto a la claridad, me parece más claro que en este contexto. Supongo que ese aspecto se reduce a preferencias personales.
Tim
14
Sí, preferencia y hábito. Si no estás acostumbrado a ver for(;;), obviamente se verá extraño. Pero te recomiendo que te acostumbres porque es un idioma común, y vas a toparte con él nuevamente. ;)
jalf
77
El comentario de jalf sobre que es idiomático es realmente la respuesta aquí. Se usa comúnmente para "bucle infinito" simplemente porque es la forma más común de escribir "bucle infinito" en C. No tiene que haber una buena razón para un idioma: es solo una convención que se refuerza a sí misma.
caf
77
@ Steve: No veo por qué alguna vez usaría for(;condition;). Eso es lo que un bucle while es para . Pero como dije, con un bucle infinito, realmente no quiero que el compilador compare ninguna condición. Ingenuamente, con un whilebucle, tendría que probar truecada iteración (obviamente, ni siquiera el compilador más tonto haría eso, pero es el principio lo que me molesta. Me sorprende que especifiques en exceso tu código), mientras que con un for(;;)literalmente estás diciendo "no hay condición para probar. Solo bucle". Me parece el equivalente más cercano a tu imaginarioloop {...}
jalf
32
Su compilador apesta si while(true)da una advertencia.
Albert
56

Personalmente lo uso for (;;)porque no contiene ningún número, es solo una palabra clave. Yo prefiero a while (true), while (1), while (42), while (!0), etc, etc.

ta.speot.is
fuente
38
0, 1 e infinito son números mágicos aceptables, extender 0 y 1 a falso y verdadero no es una pérdida. trueno es más un número mágico que foruna palabra clave mágica o que for(;;)utiliza un infinito mágico implícito. (de while (42)hecho es una abominación.)
38
Tangente: uno de mis profesores de CS dijo "solo hay tres números en la programación: 0, 1 y n. Cualquier otra cosa se llama un número mágico".
Ben Zotto
21
while (42) es el más genial, no produce resultados diferentes con respecto a while (1) o while (verdadero) o while (! 0), y tiene un significado filosófico . Supongo que for(;;)se analiza más rápido que los demás de todos modos
ShinTakezou
2
@ShinTakezou mucho mejor #define LIFE 42 while (LIFE):)
mr5 01 de
1
bien while(true)no contiene ningún número también. y para (;;) no es una palabra clave
RiaD
49

Por Dennis Ritchie

  • Empecé a usarlo for (;;)porque así es como lo hace Dennis Ritchie en K&R, y cuando aprendo un nuevo idioma siempre trato de imitar a los tipos inteligentes.

  • Esto es idiomático C / C ++. Probablemente sea mejor a largo plazo acostumbrarse si planea hacer mucho en el espacio C / C ++.

  • Su #definevoluntad no funciona, ya que lo de ser #define tiene que parecer un identificador C.

  • Todos los compiladores modernos generarán el mismo código para las dos construcciones.

Mark Harrison
fuente
10
Sí, así es como sabes que alguien aprendió C de K&R, de la forma en que se debe aprender. Cada vez que veo while(TRUE), sospecho que el programador es un novato en C, o aprendí C de un libro For Dummies.
Kristopher Johnson
13
Escuché que esos novatos también usan un estilo de definición de funciones novedoso .
Justin
46

Ciertamente no es más rápido en ningún compilador cuerdo. Ambos serán compilados en saltos incondicionales. La versión for es más fácil de escribir (como dijo Neil) y será clara si comprende la sintaxis de bucle.

Si tienes curiosidad, esto es lo que gcc 4.4.1 me da para x86. Ambos usan la instrucción x86 JMP .

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

compila a (en parte):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite
Matthew Flaschen
fuente
Dudo que sea más rápido incluso en modo de depuración.
Steven Sudit
106
for_infinitees más rápido; 2 caracteres menos para puts.
Dave Jarvis
43

yo prefiero for (;;) porque es el más consistente en diferentes lenguajes tipo C.

En C ++ while (true)está bien, pero en C depende de un encabezado para definir true, pero también TRUEes una macro de uso común. Si lo usa while (1), es correcto en C y C ++, y JavaScript, pero no en Java o C #, que requieren que la condición del bucle sea booleana, como while (true)o while (1 == 1). En PHP, las palabras clave no distinguen entre mayúsculas y minúsculas, pero el lenguaje prefiere las mayúsculas TRUE.

Sin embargo, for (;;)siempre es completamente correcto en todos esos idiomas.

Boann
fuente
9
¡Gracias por tu respuesta! Creo que esta es realmente la primera respuesta que muestra una forma objetiva que for (;;)es mejor.
Chris Cooper
8
No creo haber necesitado escribir código correcto en C, C ++, JavaScript, Java y C #. Son idiomas diferentes
Keith Thompson
66
@KeithThompson no se trata de escribir código que sea correcto en muchos idiomas; Creo que se trata de evitar interpretaciones erróneas entre desarrolladores con diferentes antecedentes.
Mauro Sampietro
66
@ Sam: Tanto while (1)y for (;;)son expresiones comunes para los bucles infinitos en C. Cualquier persona que lea un programa en C que tiene problemas para entender bien es probable que tenga problemas con el resto del código. No vale la pena escribir código C que pueda leer fácilmente alguien que no conozca C.
Keith Thompson
66
@KeithThompson Si bien un lector competente de C definitivamente debería estar familiarizado con ambas expresiones idiomáticas, esto también podría ser útil si el escritor es un programador políglota. En mi último trabajo trabajé en JS, ActionScript y PHP a diario, y unificando la forma en que uno escribe el código (donde tiene sentido hacerlo) puede hacer que la programación sea más rápida y el mantenimiento más fácil.
Ionoclast Brigham
21

Personalmente prefiero el for (;;)idioma (que se compilará con el mismo código que while (TRUE).

El uso while (TRUE)puede ser más legible en un sentido, he decidido usar el for (;;)idioma porque se destaca .

Una construcción de bucle infinito debería notarse fácilmente o llamarse en código, y personalmente creo que el for (;;)estilo lo hace un poco mejor que while (TRUE)o while (1).

Además, recuerdo que algunos compiladores emiten advertencias cuando la expresión controladora de un ciclo while es una constante. No creo que eso suceda demasiado, pero solo el potencial de advertencias espurias es suficiente para querer evitarlo.

Michael Burr
fuente
17

He visto que algunas personas lo prefieren porque tienen un #definir en algún lugar como este:

#define EVER ;;

Lo que les permite escribir esto:

for (EVER)
{
    /* blah */
}
rmeador
fuente
24
Yo también lo he visto; pero no es una buena razón para preferirlo. Como mantenedor, aún tendría que verificar la definición de macro para asegurarse de que hizo lo que esperaba, mientras que el código original era lo suficientemente claro. El RTOS VxWorks tiene una macro FOREVERdefinida for(;;), pero eso no es mejor. Las macros IMO no deben usarse para 'inventar' un nuevo lenguaje.
Clifford
8
En realidad, el propósito de las macros en algunos idiomas es inventar una nueva sintaxis. Pero independientemente de 'for (EVER)' en C / C ++ es atroz.
Dan Olson el
15
Algunas personas hacen cosas raras, como si les gusta Pascal dicen #define BEGIN {y #define END }. Incluso he visto #define DONKEYS_FLY (0)para que puedan decir if DONKEYS_FLY .... ¿Quién dice que el software es aburrido?
Mike Dunlavey
11
En California te creo que tienes que #definir (;;) LIKE_FOREVER
Martin Beckett el
1
No pude resistir: #define never while(0)y#define always
alfC
16

¿Qué pasa (si su idioma lo admite):

start:
/* BLAH */
goto start;
estropear
fuente
... que debería generar una salida idéntica en manos de cualquier compilador razonable.
Ben Zotto
9
+1! No mejora gotolas numerosas desventajas, pero si el algoritmo que está tratando de implementar proviene de un diagrama de flujo, esta es la traducción más directa.
Edmund
44
Yo personalmente tomo una visión utilitaria sobre goto. No hay aves rapaces. Las aves rapaces son personas. Y fueron las personas las que comenzaron a usar goto para hacer código de espagueti. Además, la salida ensamblada para un bucle se ve más o menos así. Los conjuntos de instrucciones para computadoras no tienen conceptos de "for" o "while", solo "jump".
josaphatv
nunca jamás usogoto
Edward Karak
Lo realmente bueno gotoes que no tiene que preocuparse de que alguien agregue un breakpara hacer que su ciclo sea menos infinito. (a menos que ya estés dentro de otro whileo un forbucle, por supuesto ...)
12

No hay diferencia en términos del código de máquina que se genera.

Sin embargo, solo para contrarrestar la tendencia, argumentaría que la forma while (TRUE) es mucho más legible e intuitiva que para (;;), y que la legibilidad y la claridad son razones mucho más importantes para las pautas de codificación que cualquier otra razón I ' He escuchado el enfoque for (;;) (prefiero basar mis pautas de codificación en razonamiento sólido y / o prueba de efectividad por mí mismo).

Jason Williams
fuente
66
Eso depende de tu idioma. for(;;)es la forma tradicional de hacer esto en C y C ++. while(true)parece ser la convención en C # y Java y otros lenguajes. Su experiencia puede ser diferente.
Billy ONeal
9
Sí, y alguien que no esté muy familiarizado con C o C ++ podría encontrar que STRING_SCAN_FORMATTED es más legible que sscanf, pero no ve a nadie poniendo #define STRING_SCAN_FORMATTED sscanf en la parte superior de su código.
ta.speot.is
44
Yo diría que la forma idiomática de hacerlo había mejor será la más legible a su desarrollador. De lo contrario, realmente necesita mejores desarrolladores.
jalf
55
@despart: si alguien no está lo suficientemente familiarizado con C ++ como para reconocer ese idioma por lo que es, entonces debe mantenerse alejado de mi base de código.
Billy ONeal
44
Estoy de acuerdo en que la forma idiomática debería ser la más legible. Es por eso que las formas idiomáticas siempre deben ser desafiadas y cambiadas a medida que evolucionan los idiomas y las prácticas. Tomó años para que el terrible estilo de codificación "idiomático" de K&R fuera reemplazado por el estilo moderno y más legible, pero aún así sucedió.
Jason Williams
11

No solo un patrón bien conocido, sino un idioma estándar en C (y C ++)

James McLeod
fuente
3
Sí, y creo que algunos compiladores advierten while (true)por la misma razón que lo hacen if (true).
Steven Sudit
11
while(true)

genera una advertencia con Visual Studio (la condición es constante). La mayoría de los lugares en los que he trabajado compilan compilaciones de producción con advertencias como errores. Entonces

for(;;)

se prefiere.

Miguel
fuente
77
¿Qué versión de Visual Studio estás usando? Con 2008 no recibo esta advertencia, incluso en el nivel de advertencia 4.
Jörgen Sigvardsson
11

Ambos deberían ser iguales si su compilador optimiza su código. Para explicar lo que quiero decir con optimización, aquí hay un código de muestra escrito en MSVC 10:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

Si lo compila en modo de depuración ( sin optimización (/ Od) ), el desmontaje muestra la clara diferencia. Hay instrucciones adicionales para la truecondición en el interior while.

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

Sin embargo, si construye su código en modo Release (con la velocidad de maximización predeterminada (/ O2) ) obtendrá la misma salida para ambos. Ambos bucles se reducen a una instrucción de salto.

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

Cualquier cosa que use no importa para un compilador decente con optimización de velocidad activada.

SylvanBlack
fuente
¡Este es realmente un muy buen punto! Sin optimización, incluso los compiladores modernos diferirán según varias instrucciones.
9

Es una cuestión de preferencia personal qué camino es más rápido. Personalmente, soy un touchtypist y nunca miro mi teclado, durante la programación, puedo tipear las 104 teclas de mi teclado.

Me parece más rápido escribir "while (TRUE)".

Agregué mentalmente algunas medidas de movimiento de los dedos y las totalicé. "for (;;)" tiene aproximadamente 12 anchuras de tecla de movimientos hacia atrás y cuarto (entre las teclas de inicio y las teclas, y entre las teclas de inicio y la tecla MAYÚS) "while (TRUE)" tiene aproximadamente 14 anchuras de teclas de movimientos hacia atrás y cuarto.

Sin embargo, soy mucho menos propenso a errores al escribir este último. Pienso mentalmente en palabras a la vez, por lo que me resulta más rápido escribir cosas como "nIndex" que acrónimos como "nIdx" porque tengo que deletrear mentalmente las letras en lugar de decirlas dentro de mi mente y dejar que mis dedos se auto -tipear la palabra (como andar en bicicleta)

(Mi referencia de TypingTest.com = 136 WPM)

Mark Rejhon
fuente
3
Creo que el OP se refería a la velocidad de ejecución, no a la velocidad de escritura.
Lo sé. Solo tenía que cubrir esa base, también.
Mark Rejhon
77
s / preferencia personal / hábito individual /
SamB
@SamB: Comenta un voto positivo para s ///. xD Y sí, aunque sugerí que puede deberse a la velocidad de ejecución, no sabía la respuesta real. Si esto fuera así, habría sido feliz.
Chris Cooper
Ejecute time head -10 >/dev/null, escriba cada 10 veces y mida los resultados. Apuesto a que serás más rápido a for(;;)menos que hagas trampa. Estaba en aproximadamente el 14%.
PSkocik
6

Todas buenas respuestas: el comportamiento debe ser exactamente el mismo.

SIN EMBARGO - Solo suponga que HIZO la diferencia. Supongamos que uno de ellos toma 3 instrucciones más por iteración.

¿Te debería importar?

SOLO si lo que haces dentro del bucle es casi nada , lo cual casi nunca es el caso.

Mi punto es que hay micro-optimización y macro-optimización. La microoptimización es como "cortarse el pelo para perder peso".

Mike Dunlavey
fuente
3
¿Con qué frecuencia se ve gente dijeron preferir ++imás i++?
Dennis Zickefoose
77
@Dennis Zickefoose: la diferencia entre ++iy i++potencialmente puede ser significativa si se itrata de una instancia de una clase en lugar de una integrada y el compilador no aplica la optimización trivial. El consejo es adquirir un hábito para que no te atrape cuando sea necesario.
Clifford
55
Lo que pasa con ++ivs i++es que no le cuesta nada hacer la "optimización". Es cierto, en la mayoría de los casos no hace absolutamente ninguna diferencia, pero son igualmente fáciles de escribir, entonces, ¿por qué no preferir el potencialmente más eficiente por defecto? Y supongo que lo mismo se aplica aquí. Si uno era un poco más rápido que el otro, ¿por qué no elegir el más rápido? ¿Qué perderíamos al hacerlo? Ambos son bastante fáciles de leer y escribir.
jalf
2
@Dennis Zickefoose: Tienes razón. Veo mucho en SO, y el comentario de Clifford es correcto. Además, hay algo que no veo mucho en SO, y es cómo hacer una optimización de macro, como una aceleración de 43x: stackoverflow.com/questions/926266/… . Entonces me pregunto sobre nuestras prioridades.
Mike Dunlavey
2
@ Mike: Sí, pero esa es una comparación de manzanas con naranjas. Cortarse el cabello toma tiempo real, y probablemente incluso dinero. Estoy de acuerdo en que es una microoptimización que realmente no importa. Pero tampoco nos cuesta nada. si puedo elegir ir a la izquierda o a la derecha, y la distancia es la misma, el terreno es el mismo, todo es igual, excepto que el camino izquierdo tiene algún beneficio microscópico marginal, ¿por qué no ir a la izquierda? Tienes razón, no es un argumento impresionante. Pero cuando el costo es literalmente cero, no veo ninguna razón para preferir la ruta menos óptima.
jalf
5

No puedo imaginar que un compilador valioso generaría un código diferente. Incluso si lo hiciera, no habría forma de determinar sin probar el compilador particular que era más eficiente.

Sin embargo, sugiero que prefiera for(;;)por las siguientes razones:

  • Varios compiladores que he utilizado generarán una advertencia de expresión constante para while (verdadero) con la configuración de nivel de advertencia adecuada.

  • en su ejemplo, la macro VERDADERO puede no estar definida como espera

  • Hay muchas posibles variantes de la infinita mientras bucle tales como while(1), while(true), while(1==1)etc .; así for(;;)es probable que resulte en una mayor consistencia.

Clifford
fuente
TRUE puede no ser #define TRUE 1, pero cualquier código base en el que se while(TRUE)evalúa como while(0)no es probable que se beneficie for(;;).
Justin
@Justin: Estoy de acuerdo, sería realmente perverso, y no es el más fuerte de los tres argumentos, pero Bjarne Stoustrup usa un argumento similar para evitar la macro NULL en C ++. while(true)debe preferirse en cualquier caso. En C ++ boolestá reservado, y en C se define en C stdbool.h (lo que lo hace menos seguro en C). for(;;)elimina toda duda
Clifford
5
for(;;Sleep(50))
{
    // Lots of code
}

Es más claro que:

while(true)
{
    // Lots of code
    Sleep(50);
}

No es que esto se aplique si no lo está usando Sleep().

Armada
fuente
1
Es un código muy malo, el temporizador debe usarse en lugar de dormir, por lo que es un mal ejemplo
ST3
12
@ ST3 - Sí, tienes razón. Mi código es horrible Debería esforzarme más la próxima vez que haga un bucle infinito.
Armada
1
@Frammo - depende de su sistema operativo, pero generalmente algo así comotimerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta
2
No hay nada de limpio en llamar a una función como dormir dentro de un bucle for como ese
Greg
1
OMG, timerService.scheduleRepeating (50, [] () {}) es muchísimo más fácil de escribir y comprender que dormir (50).
Cool Javelin
4

El bucle "para siempre" es popular en los sistemas integrados como un bucle de fondo. Algunas personas lo implementan como:

for (; ;)
{
 // Stuff done in background loop
}

Y a veces se implementa como:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

Y otra implementación más es:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

Un compilador de optimización debería generar el mismo código de ensamblaje o uno similar para estos fragmentos. Una nota importante: el tiempo de ejecución de los bucles no es una gran preocupación ya que estos bucles duran para siempre y se dedica más tiempo a la sección de procesamiento.

Thomas Matthews
fuente
8
Si un compilador genera un código diferente para ellos, es hora de deshacerse del compilador y obtener uno de las últimas dos décadas.
GManNickG
55
"el tiempo de ejecución de los bucles no es una gran preocupación, ya que estos bucles duran para siempre" - Eso suena tan mal a mí ..
Blindy
3
@Blindy: debido a que está mal, lo que preocupa es la fracción del tiempo de ejecución gastado procesando la lógica de bucle, o la cantidad de lógica de bucle por unidad de trabajo útil, ninguno de los cuales es ayudado por el bucle infinito
Ben Voigt
3

Supongo que while (true) es más legible que for (;;): parece que el programador pierde algo en for loop :)

nik
fuente
Me importa la velocidad. Especialmente si hay una optimización que afectará mi código infinitas veces.
Kowalski
2

La razón más importante para usar "for (;;)" es el miedo a usar "while (TRUE)" cuando haces programación exploratoria. Es más fácil controlar la cantidad de repeticiones con "for", y también, es más fácil convertir el bucle "for" en un infinito.

Por ejemplo, si está construyendo una función recursiva, puede limitar la cantidad de llamadas a la función antes de convertirla en un bucle infinito.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

Cuando estoy seguro de mi función, la convierto en un bucle infinito:

    for(;;) recursiveFunction(oneParam);
Ignacio Cortorreal
fuente
3
El primer bucle tiene un error de sintaxis (falta un punto y coma).
Jens
3
¡Decir ah! De este modo demostrando la desventaja de for (;;);)
Andrew