2010-08-16 7 views

Respuesta

12

Consonantes constantes son a menudo suficientes errores. Considere esto:

unsigned k; 
... 
while (k>=0) 
{ 
... 
} 

La condición k>=0 tendría sentido si k era un int firmado, pero no para firmar. Un desarrollador descuidado olvida que k fue declarado sin firmar y que lo usaría como si fuera utilizable como un número negativo. El compilador intenta ser útil y le advierte al respecto y while(1) se enamora del compilador en la misma clase de problema. for(;;) es preferible porque inequívocamente significa `loop forever

+0

+1 para mencionar los errores de signo más comunes. :-) –

+3

El compilador es bastante inteligente; lo suficientemente inteligente como para hacer todo tipo de magia, pero no lo suficientemente inteligente como para entender que "mientras (verdadero)" no está sujeto a esos problemas? –

8

for(;;) y while (true) son diferentes en que el primero es un caso especial definido para ser un bucle infinito, mientras que el último es una especie de abuso de decir "verdad, siempre."

La advertencia aparece porque los bucles infinitos cuando you don't want them son bastante malos, por lo que le advierte que puede tener uno al primer signo. Pero al usar for(;;), has dicho explícitamente "bucle esto para siempre", y no hay nada por lo que advertir.

No creo que GCC tenga una advertencia equivalente.

+0

gracias. eso tiene sentido. –

Cuestiones relacionadas