2011-09-23 3 views
5

Sto utilizzando PC Lint per la prima volta. Stavo "linting" il mio codice, quando PC Lint mi avvisa del mio while(TRUE).PC Lint while (TRUE) vs for (;;)

Questo è quello che dice:

716: while (1) ... - Un costrutto della forma, mentre (1) ... è stato trovato.

Mentre questo rappresenta una costante in un contesto che si aspetta un booleano, può riflettere un criterio di programmazione per cui i cicli infiniti sono preceduti da questo costrutto. Quindi viene assegnato un numero separato e è stato inserito nella categoria informativa. La forma più convenzionale di prefisso ciclo infinito è per (;;).

Non ho capito questa affermazione. Qualcuno può aiutarmi a capirlo?

+2

'while (TRUE)' potrebbe non essere un loop infinito se qualcuno imposta 'TRUE' su '0' mentre non c'è modo che ciò accada con' for (;;) '. –

+2

@Dan D., certo che c'è - stiamo parlando del preprocessore dopotutto. Che dire di '#define per (;;) if (0)'? ;-) –

+1

So di cosa sta parlando, ma questa è una strana spiegazione che ho da dire. –

risposta

5

Il testo dice che sebbene while(TRUE) (che viene preprocessati in while(1)) è un ciclo infinito perfettamente valido, la forma più convenzionale di scrivere un ciclo infinito è

for(;;) 
{ 
    ... 
} 

perché non utilizza alcun valore al tutto e quindi è meno soggetto a errori.

3

Si dice che il ciclo infinito più convenzionale è for(;;), che direi che è un'affermazione discutibile e che è classificato questo costrutto come una "categoria informativo" trovare - Ho il sospetto che se si è utilizzato il for(;;) invece sarebbe va via. Ho sempre scritto questi come while(1) e mai nello stesso for(;;). Se fa quello che ti aspetti, ignorerei i risultati di PC LINT su questo o lo cambierei se sei preoccupato per qualcuno ridefinendo TRUE perché se qualcuno ha ridefinito TRUE il tuo ciclo non sarebbe stato eseguito affatto.

+6

E comunque, se qualcuno ha ridefinito 'TRUE', sarebbe l'ultimo dei tuoi guai che un ciclo pratico non funzioni all'infinito: -) –