При выполнении цикла for сначала осуществляется инициализация. Она выполняется в начале цикла и больше никогда не повторяется. Обычно этот оператор инициализирует переменную, управляющую циклом. Затем происходит проверка_условия, называемая условием окончания цикла. Если проверка_условия дает значение "истина", то выполняется один или несколько операторов внутри цикла. Если произошел вход в цикл, то после выполнения всех операторов внутри цикла осуществляется коррекция. Если же проверка_условия дала значение "ложь", то операторы внутри цикла и оператор коррекции игнорируются и управление передается оператору, следующему за циклом. Цикл for с несколькими операторами внутри:
for (инициализация; проверка_условия; коррекция) {
оператор_а;
оператор_b;
оператор_с;
оператор_n;
}
Если нужно выполнить несколько операторов, то необходимы фигурные скобки для их объединения с управляющей структурой цикла.
Пример: выполняется суммирование первых пяти целых чисел. Подразумевается, что переменные isum и lvalue предварительно описаны как целые:
isum = 0;
for(ivalue=1; lvalue <= 5: ivalue++)
isum -t-= lvalue;
После инициализации переменной isum значением 0, выполняется цикл for. Во-первых, переменная lvalue устанавливается в 1 (это осуществляется только один раз); во-вторых, значение lvalue сравнивается с условием окончания цикла <==5. Поскольку результат сравнения — "истина", к переменной isum добавляется 1. Как только оператор выполнился, значение переменной управления циклом {lvalue) увеличивается на 1. Этот процесс повторяется еще четыре раза до тех пор, пока значение lvalue не увеличится до 6 и цикл не закончится.
Аналогичный фрагмент можно записать на C++ следующим образом:
for(int ivalue=1; ivalue <= 5; ivalue++)
isum -<<-= ivalue;
Можно объявлять и инициализировать переменную управления циклом внутри цикла for. Это очень важное дополнение для программистов, заботящихся о структурированности программы и о правильности расположения объявлений переменных. Можно объявлять переменные непосредственно перед тем оператором, в котором они используются. В предыдущем примере допустимо локальное объявление переменной lvalue, так как она используется только для вычисления isum — переменной, имеющей большую, чем lvalue, область действия. Взгляните, однако, на следующий пример:
int isum = 0;
for(int ivalue=1; ivalue <= 5; ivalue++)
isum += ivalue;
Чтобы добиться структурированности проектирования и отладки, лучше всего использовать локализованные объявления всех переменных. Редко бывает, когда в программе оправдано объявление некоторой переменной в нестандартном месте, в результате чего затрудняется чтение, проверка и возможность редактирования программы.
Значение, используемое в циклах for в качестве переменной управления циклом, не всегда изменяется на 1 (при помощи операции ++). В следующем примере суммируются все нечетные числа до 9:
iodd sum = 0;
for(iodd_value=1; iodd_value <= 9; iodd_value+=2)
iodd_sum += iodd_value;
В этом примере переменная управления циклом iodd_value инициализируется значением 1 и увеличивается на 2.
Конечно же, циклы for не всегда выполняют пересчет от меньшего значения к большему. В следующем примере цикл for используется для чтения массива символов и последующей печати символьной строки в обратном направлении:
for (ioffset = CARRAY_SIZE - 1; ioffset >= 0; ioffset--)
putchar(carray[ioffset]);
return(0);
}
В этом примере в первом цикле for инициализируется переменная ioffset, получая значение 0, затем символы считываются до тех пор, пока имеются свободные элементы в массиве carray. Во втором цикле for переменная управления циклом ioffset получает значение смещения последнего элемента массива, и до тех пор, пока в ioffset содержится допустимое смещение, символы печатаются в обратном порядке. Такая процедура может иметь смысл для синтаксического анализа некоторого инфиксного выражения, преобразованного в префиксное.
Если используются несколько циклов for, то необходимо в соответствующих местах ставить фигурные скобки для правильного выполнения операторов:
Если вокруг первого цикла for нет фигурных скобок, то с циклом связан только первый оператор printf(). После того, как оператор printf() выполнится 5 раз, происходит переход ко второму циклу for. Во внутреннем цикле последнее значение переменной iouter_val (5) используется для вычисления значений, печатаемых оператором printf().