PC Lint while (TRUE) vs for (;;)


5

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

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 (;;)'. 23 sep. 112011-09-23 11:31:58

+2

@Dan D., seguro que hay - estamos hablando del preprocesador después de todo. ¿Qué tal '' definir para (;;) if (0) '? ;-) 23 sep. 112011-09-23 11:34:18

+1

Sé de lo que está hablando, pero esa es una explicación extraña que tengo que decir. 23 sep. 112011-09-23 11:34:39

  0

Convención es fea. ;-) 23 sep. 112011-09-23 11:34:55

  0

@ PéterTörök: '#define for (;;) if (0)' es ilegal porque para (;;) no es un identificador y tampoco se puede analizar como una declaración macro 23 sep. 112011-09-23 12:05:27

+1

@Armen, es suficiente, mi C habilidades están oxidadas. Aunque creo que puede haber alguna manera retorcida de hacerlo realmente. Y si alguien es lo suficientemente malo como para redefinir 'VERDADERO', él también puede redefinir 'por' :-( 23 sep. 112011-09-23 12:10:01

  0

Nah, la convención común es que mientras (42) asegura la salida después de 8 millones de años. La arbitrariedad del valor es suficiente razón para no usar uno, porque (;;) es un gran bache de velocidad para un lector. 23 sep. 112011-09-23 12:46:52

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: -) 23 sep. 112011-09-23 11:44:14