En mis días de C / C ++, codificaba un "bucle infinito" como
while (true)
se sentía más natural y me parecía más obvio en lugar de
for (;;)
Un encuentro con PC-lint a fines de la década de 1980 y las posteriores discusiones sobre las mejores prácticas me rompieron este hábito. Desde entonces he codificado los bucles usando la for
declaración de control. Hoy, por primera vez en mucho tiempo, y quizás mi primera necesidad de un bucle infinito como desarrollador de C #, me enfrento a la misma situación. ¿Es correcto uno de ellos y el otro no?
c#
infinite-loop
Bob Kaufman
fuente
fuente
while(true)
requiere una condición.for(;;)
por lo tanto, es una mejor representación para bucles infinitos que se repiten incondicionalmente. 2. Es posible que los compiladores antiguos no optimizados hayan evaluado realmente el(true)
bucle. 3. C es un lenguaje minimalista de la época de los teletipos, terminales de 300 baudios y nombres de variables de 1 carácter. En un entorno donde cada pulsación de tecla cuenta,for(;;)
es bastante más corto quewhile(true)
.Respuestas:
Siempre es lo que he usado y lo que he visto que otros usan para un bucle que debe romperse manualmente.
fuente
El compilador de C # transformará ambos
y
dentro
El CIL para ambos es el mismo. La mayoría de las personas encuentran
while(true)
que es más fácil de leer y comprender.for(;;)
es bastante críptico.Fuente:
Me metí un poco más con .NET Reflector , y compilé ambos bucles con "Optimizar código" en Visual Studio.
Ambos bucles se compilan en (con .NET Reflector):
Las rapaces deberían atacar pronto.
fuente
goto
declaración, por cierto, lo cual no es ninguna sorpresa.goto LOOP
es el ciclo infinito C # correcto :)Creo que esto puede ser más fácil de leer y definitivamente es el estándar para usar en C #:
fuente
while(1)
no es válido en C #, ya1
que no es unbool
.Jadeo, uso:
O como señaló jsight , es posible que desee estar doblemente seguro:
Antes de que la gente me grite, es todo el mismo código CIL, lo comprobé :)
fuente
Para repetir un par de viejos chistes:
for (;;) {}
" - hace llorar la declaración.#define EVER ;;
".fuente
#define ever (;;)
que creo que es más legible.for ever {}
#define forever while(true)
:;)Si desea ir a la vieja escuela, goto todavía es compatible con C #:
Para un bucle verdaderamente infinito, este es el comando de acceso. =)
fuente
Creo que
while (true)
es un poco más legible.fuente
En aquellas situaciones en las que necesitaba un verdadero bucle infinito, siempre he usado
Parece expresar mejor la intención que una declaración vacía.
fuente
Personalmente, siempre he preferido
for(;;)
precisamente porque tiene ninguna condición (a diferencia dewhile (true)
que tiene un siempre-verdadero). Sin embargo, este es realmente un punto de estilo muy menor, sobre el que no creo que valga la pena discutir de ninguna manera. Todavía no he visto una guía de estilo de C # que obligue o prohíba cualquiera de los enfoques.fuente
while
". En lo que respecta al programador, el compilador transforma el código de alto nivel en IL. No hay bucleswhile
(ofor
) en IL, solo etiquetas y gotos.Personalmente prefiero el
for (;;)
idioma (desde el punto de vista de C / C ++). Si bien estoy de acuerdo en quewhile (true)
es más legible en cierto sentido (y es lo que usé hace mucho tiempo incluso en C / C ++), he recurrido a usar elfor
idioma porque:Creo que el hecho de que un bucle no termine (de manera normal) vale la pena "llamarlo", y creo que lo
for (;;)
hace un poco más.fuente
for
awhile
. Para ambosfor (;;){}
ywhile (true){}
, generawhile(true){}
código nuevo . Vea esta respuesta .Se recomienda el libro original de K&R para C, del cual C # puede rastrear su ascendencia
para bucles infinitos. Es inequívoco, fácil de leer y tiene una larga y noble historia detrás.
Anexo (febrero de 2017)
Por supuesto, si cree que esta forma de bucle (o cualquier otra forma) es demasiado críptica, siempre puede agregar un comentario .
O:
fuente
No debería ser
while(true)
asíwhile(1)
, por lo quewhile(1)
es incorrecto en C #, sí;)fuente
Alternativamente, se podría decir que tener un bucle infinito es normalmente una mala práctica de todos modos, ya que necesita una condición de salida a menos que la aplicación realmente se ejecute para siempre. Sin embargo, si esto es para un misil de crucero, aceptaré que no se requiera una condición de salida explícita.
Aunque me gusta este:
fuente
f < 16777217f
es siemprefalse
... así que esto nunca se repite.Prefiero un código un poco más "alfabetizado". Es mucho más probable que haga algo como esto en la práctica:
fuente
do ... while()
bucle disfrazado. Solo me tomó unos segundos ver eso. Si hubiera escrito undo ... while()
bucle, habría quedado claro de inmediato. -1break
.Incluso yo también digo que el de abajo es mejor :)
fuente
Si estás jugando al golf con códigos, te sugiero
for(;;)
. Más allá de eso,while(true)
tiene el mismo significado y parece más intuitivo. En cualquier caso, es probable que la mayoría de los programadores comprendan ambas variaciones, por lo que en realidad no importa. Usa lo que te resulte más cómodo.fuente
La única razón por la que diría
for(;;)
es debido a las limitaciones de CodeDom (mientras que los bucles no se pueden declarar usando CodeDom y los bucles for se consideran la forma más general como un bucle de iteración).Esta es una razón bastante imprecisa para elegir esto además del hecho de que
for
implementación bucle se puede usar tanto para código normal como para código generado por CodeDom. Es decir, puede ser más estándar.Como nota, puede usar fragmentos de código para crear un
while
bucle, pero el bucle completo debería ser un fragmento ...fuente
Ambos tienen la misma función, pero la gente generalmente lo prefiere
while(true)
. Se siente fácil de leer y comprender ...fuente
Cualquier expresión que siempre devuelva verdadero debería estar bien para el ciclo while.
Ejemplo:
fuente
En términos de legibilidad del código
while(true)
en cualquier idioma, creo que tiene más sentido. En términos de cómo lo ve la computadora, realmente no debería haber ninguna diferencia en la sociedad actual de compiladores e intérpretes muy eficientes.Si hay alguna diferencia de rendimiento, estoy seguro de que la traducción a MSIL se optimizará. Podrías comprobarlo si realmente quisieras.
fuente