2010-08-16 8 views

Odpowiedz

12

Stałe warunkowe często wystarczają po prostu jako błędy. Rozważ to:

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

Warunkiem k>=0 miałoby sensu gdyby k było podpisane int, ale nie podpisany. Nieostrożny programista zapomina, że ​​k został uznany za niepodpisany i użył go tak, jakby był użyty jako liczba ujemna. Kompilator próbuje być pomocny i ostrzega o tym, a while(1) przypada kompilatorowi na tę samą klasę problemu. for(;;) jest preferowany, ponieważ jednoznacznie oznacza "pętla na zawsze

+0

+1 za wzmiankę o typowych błędach sygnalizacyjnych. :-) –

+3

Kompilator jest całkiem sprytny; wystarczająco inteligentny, aby wykonywać wszystkie rodzaje magii, ale nie na tyle sprytnie, by zrozumieć, że "podczas (prawda)" nie podlega tym problemom? –

8

for(;;) i while (true) różnią się tym, że były to specjalny przypadek zdefiniowane być nieskończoną pętlę, a drugi jest rodzajem nadużycia mówiąc: „prawda, zawsze.”

Ostrzeżenie pojawia się, ponieważ nieskończone pętle, gdy you don't want them są dość złe, więc ostrzega Cię, że możesz mieć jeden na pierwszym znaku. Ale używając for(;;), powiedziałeś całkiem wyraźnie "zapętlaj to na zawsze" i nie ma o czym ostrzegać.

Nie sądzę, że GCC ma równoważne ostrzeżenie.

+0

dzięki. to ma sens. –

Powiązane problemy