2015-01-15 2 views
1

Я получаю предупреждение C4702: недостижимый код в цикле for; странно то, что - разрывая компоненты внутри парнов - предупреждение указывает на часть приращения. Вот пример программы, демонстрирующий эту ошибку:Недоступный код для приращения цикла?

int main() 
{ 
    int foo = 3; 
    for (int i = 0; 
     i < 999; 
     i++) // warning on this line 
    { 
     if (foo == 4); 
     { 
      break; 
     } 
    } 
    return 0; 
} 

Я не могу понять, что случилось с этой линией, так как цикл выглядит очень просто.

ответ

8

У вас есть шальная точка с запятой в вашем Условный оператор:

if (foo == 4); 

Напомним, что для петли имеют следующую структуру:

for (initialisation; condition; increment/decrement) 
    statement 

Выполнение будет происходить в следующем порядке:

  1. initialisation
  2. condition; если ложно, то конец
  3. statement
  4. increment/decrement
  5. Перейти к шагу 2

Если компилятор предупреждает о increment/decrement будучи недостижим, это означает, что что-то перед ним вызывает исполнение всегда пропустить его - в этом случае блуждающая точка с запятой приводит к тому, что break всегда выполняется, выпрыгивая из цикла преждевременно.

2
for (int i = 0; 
    i < 999; 
    i++) // warning on this line 
{ 
    if (foo == 4); 
    { 
     break; 
    } 
} 

Это так же, как

for (int i = 0; 
    i < 999; 
    )  
{ 
    if (foo == 4); 
    { 
     break; 
    } 
    i++; /* Note the increment here */ 
} 

Так или иначе вы собираетесь break из-за if(foo == 4); так i++ не достижима

0

Задачи (т.е. непреднамеренной;) уже описан в два ответа.

Я просто хочу добавить, что вы должны взглянуть на настройки параметров вашего компилятора. Многие компиляторы могут обнаружить такой «странно выглядящий» код и дать вам предупреждение. Например:

Предупреждение: «пустое тело в„если“заявление»

Далее компилятор может быть настроен для лечения все предупреждения как ошибки.

Другими словами - параметры компилятора часто могут помочь вам найти «непреднамеренный код», чтобы вы не тратили время.

BTW - редактор eclipse может даже дать предупреждение «с подозрительной точкой с запятой», как только вы введете такой оператор if.