2011-09-23 9 views
5

Estoy usando PC Lint por primera vez. Estaba "deshilachando" mi código, cuando PC Lint me advirtió acerca de mi while(TRUE).PC Lint while (TRUE) vs for (;;)

Esto es lo que dice:

716: while (1) ... - Un constructo de la forma while (1) ... fue encontrado.

Mientras que esto representa una constante en un contexto que espera un booleano, puede reflejar una política de programación por la cual los bucles infinitos son con el prefijo de este constructo. Por lo tanto, se le da un número aparte y se ha colocado en la categoría informativa. La forma más convencional del prefijo de bucle infinito es para (;;).

No entendí esta afirmación. ¿Alguien puede ayudarme a entenderlo?

+2

'while (TRUE)' puede no ser un bucle infinito si alguien establece 'TRUE' en' 0' mientras que no hay forma de que eso ocurra con 'for (;;)'. –

+2

@Dan D., seguro que hay - estamos hablando del preprocesador después de todo. ¿Qué tal '' definir para (;;) if (0) '? ;-) –

+1

Sé de lo que está hablando, pero esa es una explicación extraña que tengo que decir. –

Respuesta

5

El texto dice que aunque while(TRUE) (que se hace pre-procesada en while(1)) es un bucle infinito perfectamente válida, la forma más convencional de escribir un bucle infinito es

for(;;) 
{ 
    ... 
} 

porque no utiliza ningún valor en todo y, por lo tanto, es menos propenso a errores.

3

Dice que el bucle infinito más convencional es for(;;), lo cual diría que es una afirmación discutible, y que ha categorizado este constructo como un hallazgo de "categoría informativa". Sospecho que si usaste el for(;;), en cambio vete. Siempre he escrito esto como while(1) y nunca for(;;). Si hace lo que espera, ignoraría los hallazgos de PC LINT en este caso o lo cambiaría si le preocupa que alguien redefina TRUE porque si alguien redefinió TRUE su ciclo no se ejecutará en absoluto.

+6

Y, de todos modos, si alguien redefina 'VERDADERO', sería la menor de tus penas que un bucle práctico no se ejecute infinitamente: -) –

Cuestiones relacionadas