Почему MSVC генерирует предупреждение C4127, когда константа используется в "while" - C - PullRequest
9 голосов
/ 16 августа 2010

Для кода

while(1)
{
   /* ..... */
}

MSVC выдает следующее предупреждение.Страница

warning C4127: conditional expression is constant

MSDN для предупреждения предлагает использовать for(;;) вместо while(1).Мне интересно, какое преимущество дает for(;;) и почему оно предупреждает о постоянном использовании в while?

Какой флаг я должен использовать в GCC, чтобы получить то же предупреждение?

Ответы [ 2 ]

14 голосов
/ 16 августа 2010

Постоянные условные выражения довольно часто просто ошибки. Учтите это:

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

Условие k>=0 имело бы смысл, если бы k было int со знаком, но не для unsigned. Неосторожный разработчик забывает, что k был объявлен неподписанным, и он / она будет использовать его, как если бы его можно было использовать как отрицательное число Компилятор пытается быть полезным и предупредить вас об этом, и while(1) попадает для компилятора в тот же класс проблемы. for(;;) предпочтительнее, потому что однозначно означает `цикл навсегда

8 голосов
/ 16 августа 2010

for(;;) и while (true) отличаются тем, что первый является особым случаем , определенным как как бесконечный цикл, в то время как последний является своего рода оскорблением, говорящим "всегда верно". *

Предупреждение появляется, потому что бесконечные циклы, когда они вам не нужны довольно плохие, поэтому предупреждает вас, что у вас может быть один на первом знаке. Но, используя for(;;), вы в значительной степени явно сказали «зацикливайтесь на этом навсегда», и не о чем предупреждать.

Я не думаю, что GCC имеет аналогичное предупреждение.

...