Основы программирования

Цикл for


Популярный в других языках программирования арифметический цикл (см. с. 41) в языке Си реализуется с помощью цикла for. Он выглядит следующим образом:

for (инициализация; условие продолжения; итератор) тело цикла;

Инициализация выполняется один раз перед первой проверкой условия продолжения и первым выполнением тела цикла. Условие продолжения проверяется перед каждым выполнением тела цикла. Если условие истинно, то выполняется тело цикла, иначе цикл завершается. Итератор выполняется после каждого выполнения тела цикла (перед следующей проверкой условия продолжения).

Поскольку условие продолжения проверяется перед выполнением тела цикла, цикл for является, подобно циклу while, циклом с предусловием. Если условие продолжения не выполняется изначально, то тело цикла не выполняется ни разу, а это хорошо как с точки зрения надежности программы, так и с точки зрения простоты и эстетики (поскольку не нужно отдельно рассматривать исключительные случаи).

Рассмотрим пример суммирования массива с использованием цикла for:

double a[100]; // Массив a содержит не более 100 эл-тов int n; // Реальная длина массива a (n <= 100) double sum; // Переменная для суммы эл-тов массива int i; // Переменная цикла . . . sum = 0.0; for (i = 0; i < n; ++i) { sum += a[i]; // Увеличиваем сумму на a[i] }

Здесь целочисленная переменная i используется в качестве переменной цикла. В операторе инициализации переменной i присваивается значение 0. Условием продолжения цикла является условие i<n. Итератор ++i увеличивает переменную i на единицу. Таким образом, переменная i последовательно принимает значения 0, 1, 2,..., n-1. Для каждого значения i выполняется тело цикла.

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

for ( инициализация; инициализация; условие; while (условие) { итератор ~ тело цикла; ) { итератор; тело цикла; } }

Например, фрагмент с суммированием массива реализуется с использованием цикла while следующим образом:

i = 0; for (i=0; i < n; ++i) { while (i < n) { sum += a[i]; ~ sum += a[i]; } ++i; }

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


Содержание раздела