Этот цикл обычно используется, если точное число повторений заранее известно. Он записывается следующим образом:
for (инициализация; условие продолжения; оператор)
инструкция;
В цикле for обычно используется счетчик – переменная, которая хранит номер текущей итерации (повторения) и используется для проверки необходимости выхода из цикла. Инструкция, содержащаяся в секции инициализации, выполняется один раз в начале работы оператора for. Обычно при этом задается начальное значение счетчика (нижняя граница цикла).
Условие продолжения представляет собой условное выражение, которое вычисляется в начале каждой итерации цикла (и в начале первой итерации – тоже). Если выражение возвращает истину (любое ненулевое значение), то начинается новая итерация цикла. Если условие ложно (ноль), то цикл прерывается. Если условие никогда не станет ложным, то цикл никогда не прервется, то есть станет бесконечным. В случае если условие не выполняется уже в начале первой итерации, тело цикла ни разу не будет выполнено.
Третья часть цикла for – оператор используетсяобычно для изменения значения счетчика. Инструкция, содержащаяся в этой секции, будет выполняться после завершения каждой итерации цикла.
Инструкция, следующая за оператором for, называется телом цикла. Именно она будет повторяться до тех пор, пока выполняется условие продолжения.
Предостережение! Если в теле цикла должна находится не одна, а более инструкций, необходимо использовать операторный блок – фигурные скобки {}. Типичная ошибка новичка – написание после оператора for нескольких инструкций без {} в расчете на то, что они попадут в тело цикла. В результате в цикле будет повторяться только самая первая инструкция.
Пример вычисления суммы чисел, границы которых заданы пользователем.
#include <iostream>
using namespace std;
void main ()
{
setlocale(LC_ALL, "Russian");
int a, b, c;
int sum = 0;
cout << "Введите 2 целых числа\n";
cin >> a >> b;
if (a > b)
{
// добиваемся того, чтобы a было меньше b
c = b;
b = a;
a = c;
}
for (int i = a; i <= b; i++)
sum += i;
cout << "Сумма чисел от " << a << " до " << b << " составляет "
<< sum << endl;
system("pause");
}
Здесь счетчиком цикла является переменная i, объявленная внутри цикла на этапе инициализации. При этом область действия такой переменной будет ограничена только самим циклом, т.е. после него она видна не будет. Это типичная практика, если значение счетчика не нужно сохранять после выполнения цикла.
Предостережение! Довольно распространенной ошибкой является неверное написание оператора, изменяющего счетчик – в данном случае это i++. Эта инструкция должна именно изменять значение счетчика. Например, i++ значит то же что i += 1 и то же что i = i + 1. Это действие увеличивает значение, хранящееся в i, на единицу. Если здесь написать i + 1, то значение i никогда не изменится, условие продолжения цикла будет всегда истинным и цикл окажется бесконечным. Кроме того, в операторе for не рекомендуется изменять значение счетчика внутри тела цикла, т.к. подобные действия затрудняют понимание программы.
В цикле for можно использовать одновременно несколько переменных – счетчиков или просто выполнять несколько действий в секциях инициализации и изменения счетчиков. Например:
float x, y;
for (x = 0, y = 20; x < y; x += 0.5, y -= 0.7)
{
cout << x << '\t' << y;
cout << "\tРазность: " << y - x << endl;
}
Здесь используются две переменные цикла: x и y, начальные значения которых задаются на этапе инициализации цикла. Обе они изменяются по завершении каждой итерации: x увеличивается на 0.5, y – уменьшается на 0.7. Поскольку в теле цикла должны находиться 2 инструкции, они заключаются в операторный блок с помощью {}.
Еще одно отличие от предыдущего примера – здесь переменные x и y объявлены не в цикле, а в основной программе, поэтому они будут доступны и после выполнения оператора for.
Любая из секций в заголовке цикла может быть пропущена. Цикл из предыдущего примера может быть переписан следующим образом:
float x = 0, y = 20;
for ( ; x < y; ) // символы ';' ставятся несмотря на пропущенные секции
{
cout << x << '\t' << y;
cout << "\tРазность: " << y - x << endl;
x += 0.5;
y -= 0.7;
}
Если пропустить часть с условием продолжения, то получится бесконечный цикл. Чаще всего такой цикл записывается в виде
for(;;)
Такие циклы иногда используются в программах (обычно если условие продолжения/выхода является сложным), и для выхода из них применяется оператор break, который будет рассмотрен позднее.
Еще одной возможностью C++ является создание «пустого» цикла, т.е. цикла, не имеющего тела. Так как после оператора for одна инструкция обязательна по синтаксису, вместо нее ставят пустой оператор – «;», который лучше располагать на новой строке, чтобы его было хорошо заметно при чтении программы. В таких циклах полезная работа выполняется в заголовке for. Например, вычисление факториала.