Почему MSVC генерирует предупреждение C4127, когда константа используется в «while» - C

Для кода

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

MSVC генерирует следующее предупреждение.

warning C4127: conditional expression is constant

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

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

9
задан mjs 11 March 2015 в 13:36
поделиться

2 ответа

Постоянные условия достаточно часто являются просто ошибками. Рассмотрим следующее:

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

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

14
ответ дан 4 December 2019 в 09:34
поделиться

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

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

Я не думаю, что в GCC есть эквивалентное предупреждение.

8
ответ дан 4 December 2019 в 09:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: