2014-11-05 2 views
-2

Пока я читаю код, я обнаружил, что цикл for использовался только с двумя аргументами (тот, что посередине отсутствует). Когда программа выполняется, цикл for бесконечен. Здесь минимальная рабочая среда. Может ли кто-нибудь сказать, что не так в коде?Infinite for loop in C++

// Example program 
#include <iostream> 
using namespace std; 

int main() 
{ 
    for (int i = 0; ; i = (i+1)%2) 
    { 
     cout << i << endl; 
     } 
} 
+1

Что заставляет вас думать, что что-то не так с кодом? –

+0

Я не могу понять использование цикла здесь. Благодарю. –

+0

Вы имеете в виду, что он здесь делает? Или вы имеете в виду, как заставить его делать что-то еще? Можете ли вы уточнить, что вы не понимаете. Знаете ли вы, что делает каждое из трех утверждений? –

ответ

5

, когда у вас есть

for (statement 1;statement 2;statement 3){} 

заявление 1: выполняет на входе в цикл

заявление 2: проверяется перед каждой новой итерации, если она вычисляется как 0/ложь не продолжать

заявление 3: выполняется в конце каждой итерации независимо.

, если оставить утверждение 2 пустое это значение по умолчанию к истинному/1 и так каждый раз, когда он петлями будет оценивать как продолжение и так будет бесконечный цикл,

3

В коде нет ничего плохого, это точно так, как вы сказали ему.

Второй раздел инструкции if является условием продолжения, которое, если опущено, по умолчанию равно true.

В самом деле, вы можете оставить любую комбинацию из секций инициализации цикла, условия продолжения и после итерации, и они будут по умолчанию, соответственно:

  • нет инициализации.
  • продолжаются навсегда (при отсутствии инструкций потока управления, таких как break).
  • никаких действий после итерации.

поэтому:

for (;;) 

это вполне допустимо бесконечный цикл.

+0

"вторая строфа выражения if" Что это значит? –

3

Это объясняется в стандарте C. §6.8.5.3:

1 Оператор

                              для (пункт-1; выражение-2; expression- 3) заявление

ведет себя следующим образом: выражение выражение-2 - это управляющее выражение, которое оценивается перед каждым исполнением тела цикла. [..]

2 И пункт-1 и выражение-3 могут быть опущены. Пропущен выражение-2 заменено на ненулевой константой.

Это по существу означает, что оно будет повторяться навсегда.

Дальнейшее объяснение продолжается в примечании (который считается ненормативный):

158) Таким образом, пункт-1 указывает инициализации для цикла, возможно, объявить одну или несколько переменных для использования в петле; контролирующая экспрессия , выражение-2, определяет оценку сделанную перед каждым итерации, таким образом, что выполнение цикла продолжается до выражения сравнивает равно 0; и выражение-3 определяет операцию (например, приращение), которая выполняется после каждой итерации .

2

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

for(;;); // Yes, this will never stop 

for(int x = 0;;){ 

} 

for(int x = 0; x < 10; ++x); 

for(; someCondition != true;){} 

И так далее, все детали не являются обязательными, даже корпус.

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

1

Синтаксис для цикла в C++ является:

for (init; condition; increment) 
{ 
    //statement(s) to be executed while the condition is true 
} 

Смотрите здесь для более подробной информации: http://www.tutorialspoint.com/cplusplus/cpp_for_loop.htm

Ваш ПРОГР пропустил условие о. Поэтому цикл for повторяется навсегда.