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

Я использую PC Lint в первый раз. Я «проверял» свой код, когда PC Lint предупреждает меня о моем while(TRUE).

Вот что он говорит:

716: while(1) ... -- Найдена конструкция вида while(1) ....

В то время как это представляет собой константу в контексте, ожидающем логическое значение, это может отражать политику программирования, согласно которой бесконечные циклы имеют префикс этой конструкции. Поэтому ему присвоен отдельный номер и он помещен в информационную категорию. Более обычная форма префикса бесконечного цикла for(;;).

Я не понял этого утверждения. Может ли кто-нибудь помочь мне понять это?


person Daniel Grillo    schedule 23.09.2011    source источник
comment
while(TRUE) не может быть бесконечным циклом, если кто-то устанавливает TRUE в 0, в то время как это никак не может произойти с for(;;).   -  person Dan D.    schedule 23.09.2011
comment
@ Дэн Д., конечно, есть - в конце концов, мы говорим о препроцессоре. Как насчет #define for(;;) if(0)? ;-)   -  person Péter Török    schedule 23.09.2011
comment
Я знаю, о чем это говорит, но это странное объяснение, которое я должен сказать.   -  person Jeff Mercado    schedule 23.09.2011
comment
@PéterTörök: #define for(;;) if(0) недопустимо, потому что for(;;) не является идентификатором и не может быть проанализировано как объявление макроса   -  person Armen Tsirunyan    schedule 23.09.2011
comment
@ Армен, честно говоря, мои навыки C заржавели. Я считаю, что на самом деле может быть какой-то извращенный способ сделать это. И если кто-то достаточно злой, чтобы переопределить TRUE, он с тем же успехом может переопределить for :-(   -  person Péter Török    schedule 23.09.2011
comment
Нет, общее соглашение заключается в том, что while(42) обеспечивает выход через 8 миллионов лет. Произвольность значения — достаточная причина, чтобы не использовать его, поскольку (;;) — это большой удар по читателю.   -  person Hans Passant    schedule 23.09.2011


Ответы (2)


В тексте говорится, что хотя while(TRUE) (который предварительно обрабатывается в while(1)) является вполне допустимым бесконечным циклом, более общепринятая форма записи бесконечного цикла такова:

for(;;)
{
   ...
} 

потому что он вообще не использует никаких значений и, следовательно, менее подвержен ошибкам.

person Armen Tsirunyan    schedule 23.09.2011

В нем говорится, что более традиционным бесконечным циклом является for(;;), что я бы назвал спорным утверждением, и что он классифицировал эту конструкцию как находку «информационной категории» - я подозреваю, что если бы вы использовали for(;;) вместо этого, она исчезла бы. Я всегда писал их как while(1) и никогда не for(;;) сам. Если он делает то, что вы ожидаете, я бы проигнорировал результаты PC LINT или переключил его, если вы беспокоитесь о том, что кто-то переопределит TRUE, потому что, если кто-то переопределил TRUE, ваш цикл не будет работать со скоростью все.

person itsmatt    schedule 23.09.2011
comment
И в любом случае, если бы кто-то переопределил TRUE, это было бы наименьшей из ваших бед, что практический цикл не работает бесконечно :-) - person Péter Török; 23.09.2011