- Оператор for
- Работа
Оператор for
При реализации многих алгоритмов бывает необходимо повторить некую последовательность действий несколько раз. Такое повторение получило наименование цикла, а оператор, для соответствующего действия - оператором цикла.
В Си имеется несколько операторов цикла, один из которых -оператор for. Шаблон описания оператора следующий:
for ([список операторов1]; [условие продолжения]; [список операторов 2]) [тело цикла];
Здесь список операторов1 - перечень операторов, разделенных запятыми, которые должны быть выполнены перед началом цикла; условие продолжения - логическое выражение, истинное значение которого есть непременное условие очередной итерации цикла; список операторов2 - перечень операторов, разделенных запятыми, выполняемых после каждой итерации цикла; тело цикла - это один оператор или ограниченная фигурными скобками последовательность операторов, выполняемых на каждой итерации.
Самое важное, что любая из этих частей оператора for может отсутствовать, о чем свидетельствуют квадратные скобки в шаблоне.
Пример некоторых вариантов оператора цикла for:
for (i = 0, s = 0; i < 10; s += i++);
for (;;);
for (;i < 10;);
for (i = 0, j = 9, s = 0; i < 10; i++, j—) s += arr[i][j];
Первый цикл примера вычисляет сумму всех чисел от 0 до 9 и помещает результат в переменной s. Рассмотрим более подробно, как это происходит.
Сначала выполняются операторы i=0 и s = 0, которые инициализируют (ранее объявленные) переменные i и s. Если в момент объявления эти переменные уже проинициализированы, эта часть оператора for может отсутствовать. Затем происходит проверка условия выполнения итерации цикла, т.е. проверка i < 10. Разумеется, это истинное выражение, и, значит, происходит выполнение тела цикла - очередная (первая) итерация. В рассматриваемом примере тело цикла отсутствует, поэтому просто выполняется завершающая часть, которая состоит из оператора s += i++, который одновременно выполняет 2 действия: накапливает в переменной s сумму значений переменной i, а затем увеличивает значение i на 1. После этих действий снова осуществляется проверка условия, затем очередная итерация и т.д. до тех пор, пока значение i не станет равным 10. В этот момент условие i < 10 станет ложным, и выполнение оператора for закончится.
Продолжим рассмотрение примеров операторов for. Второй цикл, единожды начавшись, никогда не закончится, т.е. это бесконечный оператор, или бесконечный цикл. В этом случае отсутствие выражения проверки условия трактуется как истинное выражение, т.е. «нет требований к условию - значит, любые варианты подходят».
Третий пример показывает оператор цикла, который может быть бесконечным, если переменная i < 10. Т.е. для того, чтобы этот цикл не смог «завесить» программу, необходимо, чтобы либо к началу цикла переменная i уже содержала значение 10 или более, либо каким-то образом во время выполнения цикла значение i должно быть изменено.
Наконец, четвертый пример показывает, как вычислить сумму «правой» диагонали матрицы агг размером 10x10.
Следует отметить, что допускается (1) внутри списка операторов! использовать определение переменных, однако, определенные таким образом переменные, считаются существующими только пока цикл выполняется, и «исчезают» после его завершения:
for (int i=0; i < 10; i++) a += i;
Оператор for имеет довольно много вариантов и возможностей, однако не стоит увлекаться предоставляемой гибкостью. Чем более простая форма оператора будет избрана, тем меньше вероятность ошибки программирования:
// первый способ
for (int i, j=9, s; i < 10; s += arr[i++][j—]);
// второй способ
int i=0, s=0, î = 9;
for (; i<10; i++) {
s += arr[i][j];
j—;
}
В этом примере приведены два варианта ранее рассмотренного подсчета суммы «правой» диагонали матрицы, однако первый способ требует гораздо больше умственных усилий для понимания написанного, чем второй.
- Такое допущение для компилятора WinAVR возможно лишь в том случае, если включен режим соответствия стандарту С99 с расширениями GNU.