Урок 5.9. Оператор цикла for
5.9. Оператор цикла for
Оператор цикла for имеет следующую общую форму записи:
for(<выражение1>;<выражение2>;<выражение3>)<оператор> |
В операторе for <выражение1> называется инициализирующим выражением и обычно оно устанавливает начальное значение переменной цикла. Выражение <выражение2> называется проверяющим выражением и определяет условие завершения цикла. Выражение <выражение3> называется корректирующим и обычно определяет шаг изменения переменной цикла. Выражения в заголовке цикла for отделяются друг от друга точкой с запятой. Например, фрагмент программы:
float y=0; for(int n = 1; n <= 50; ++n) y += n/(n + 1.0); |
вычисляет . Здесь n = 1 – инициализирующее выражение,
n <= 50 – проверяющее выражение, ++n – корректирующее(отвечающее за итерацию цикла) выражение. Оператор цикла for работает следующим образом. Вначале вычисляется инициализирующее выражение <выражение1>. Затем, если проверяющее выражение <выражение2> истинно, то выполняется <оператор>. После выполнения <оператор> выполняется корректирующее выражение и вновь вычисляется проверяющее выражение, истинность которого влечет за собой повторное выполнение <оператор>. Если проверяющее выражение имеет значение ложь, то выполнение оператора for завершается и управление передается на оператор программы, записанный после оператора for. На месте инициализирующего выражения может быть записан инициализирующий оператор, например:
char *ptr = getStr();
int i = 0, j =0;
int lo = 0, hi = max, mid = max/2;
Алгоритмическая схема выполнения оператора for представлена на рис 5.6.
Рис 5.6. Алгоритмическая схема выполнения оператора for.
В соответствии с алгоритмической схемой, оператор for, вычисляющий сумму, будет выполняться, как это представлено на рисунке 5.7.
Рис 5.7. Схема выполнения оператора for.
Из алгоритмической схемы видно, что оператор for – это цикл с предусловием: решение выполнить в очередной раз тело цикла или нет принимается до начала его прохождения и, естественно, может случиться, что тело цикла не будет выполнено ни разу. В Си сняты ограничения на организацию цикла – параметры заголовка цикла можно изменять внутри цикла, переменная цикла сохраняет свое значение после завершения цикла. Кроме того, любое выражение в заголовке цикла или все три могут быть опущены, но при этом разделяющая точка с запятой должна сохраняться.
Например:
for( ; n < 50; n++);
for( ; ; n++);
for( ; ; ) ;
Если какое-либо из выражений заголовка цикла опущено, то в алгоритмической схеме выполнения будет отсутствовать соответствующий обрабатывающий блок. Пустое проверяющее выражение всегда считается истинным. На примере вычисления k=7! рассмотрим циклы с различными видами заголовка for:
// 1.Полный заголовок for: k=1; for(n = 7; n > 0; --n) k*=n; // 2.Отсутствует инициализирующее выражение: k=1, n = 7; for( ; n > 0; --n) k *= n; |
// 3.Отсутствуют инициализирующие и проверяющие выражения, // выход из цикла осуществляется оператором break: k=1, n = 7; for( ; ; --n) if(n <= 0) break; else k *= n; // 4.Отсутствуют инициализирующие, проверяющие и корректирующие // выражения, выход из цикла осуществляется оператором break: k = 1, n = 7; for( ; ;) if(n <= 0) break; else {k *= n; --n; } |
Во всех этих примерах k=7! вычисляется по схеме k=7*6*5*4*3*2*1. Из примеров видно, что если отсутствует инициализирующее выражение, то его необходимо записать до входа в оператор for, а если отсутствует проверяющее и корректирующее выражения, то их необходимо реализовать в теле цикла for. Конечно, это справедливо, если мы желаем хотя бы каким-то образом завершить цикл.
Большая свобода выбора количества и вида выражений, управляющих работой цикла for, позволяет с помощью этого оператора делать весьма "заумные" циклы. Однако оператор for становится более наглядным, если все выражения, управляющие работой цикла, собраны в его заголовке.
Оставить комментарий