Короче говоря, свобода при выборе выражений, управляющих циклом for, предоставляет этому циклу способность делать намного больше, чем просто выполнение фиксированного количества операций. Полезность цикла for может быть еще больше увеличена посредством операций, которые мы вскоре обсудим.
Сводка: оператор for Ключевое слово for
Общий комментарий
В операторе for используются три управляющих выражения, разделяемые точками с запятой. Выражение инициализация вычисляется однократно до выполнения любых операторов внутри цикла. Затем вычисляется выражение проверка, и если оно истинно (или не равно нулю), то тело цикла выполняется один раз. Далее вычисляется выражение обновление, после чего снова вычисляется выражение проверка. Оператор for представляет собой цикл с предусловием — решение о проходе цикла еще раз принимается перед входом в него. Таким образом, вполне возможно, что цикл не выполнится ни разу. Часть оператор может быть простым или составным оператором.
Форма записи
for (инициализация; проверка; обновление) оператор
Цикл повторяется до тех пор, пока выражение проверка не станет ложным или нулевым. Пример
for (n = 0; n < 10; n++)
printf(" %d %d\n", n, 2 * n + 1);
Дополнительные операции присваивания: +=, -=, *=, /=, %=
В языке С доступно несколько операций присваивания. Наиболее базовой из них, конечно же, является операция =, которая просто присваивает значение выражения, находящегося справа от знака операции, переменной, указанной слева от этого знака. Другие операции присваивания модифицируют переменные. В каждой такой операции имя переменной располагается слева от знака операции, а выражение — справа. Переменной присваивается новое значение, которое образовано путем корректировки ее старого значения на величину выражения, стоящего справа. Действительная корректировка зависит от операции.
222 Глава 6
Например:
scores += 20 — то же, что и scores = scores + 20 dimes - = 2 — то же, что и dimes = dimes - 2 bunnies *= 2 — то же, что и bunnies = bunnies * 2 time /= 2.73 — то же, что и time = time /2.73 reduce %= 3 — то же, что и reduce = reduce % 3
В приведенных выше примерах применялись простые числа, но эти операции также работают и с более сложными выражениями:
х *= 3 * у + 12 — то же, что их = х* (3 * у + 12)
Только что рассмотренные операции присваивания имеют такой же низкий приоритет, как и операция =, и этот приоритет меньше приоритета операции + или *. Низкий приоритет отражен в последнем примере, в котором 12 суммируется с 3 * у и только затем результат умножается на х.
Использовать все эти формы операции присваиваиия совершенно не обязательно. С другой стороны, они компактны и могут генерировать более эффективный машинный код, чем длинная форма операции. Комбинированные операции присваивания особенно полезны в ситуации, когда необходимо поместить в спецификацию цикла for сложное выражение.
Операция запятой
Операция запятой повышает гибкость цикла for, позволяя включить в его спецификацию более одного выражения инициализации или обновления. В листинге 6.13 представлена программа, которая выводит тарифы почтового обслуживания первого класса. (В 2013 году тарифы составляли 46 центов за первую унцию и 20 центов за каждую последующую унцию пересылаемого груза.)
Листинг 6.13. Программа postage.с

Первые пять строк вывода программы выглядят так:
унции тариф
1 $0.46
2 $0.66
3 $0.86
4 $1.06
Управляющие операторы С: циклы 223
Операция запятой в программе применяется в выражениях инициализации и обновления. Ее наличие в первом выражении приводит к инициализации переменных ounces и cost. Второе ее вхождение вызывает увеличение на 1 переменной ounces и увеличение на 20 (значение константы NEXT 0Z) переменной cost на каждой итерации. Все вычисления делаются в спецификациях цикла for (рис. 6.4).

Рис. 6.4. Операция запятой и цикл for
Использование операции запятой не ограничивается циклами for, но именно здесь она применяется чаще всего. Эта операция обладает еще двумя свойствами. Во- первых, она гарантирует, что разделяемые ею выражения вычисляются в порядке слева направо. (Другими словами, запятая является точкой следования, поэтому все побочные эффекты слева от запятой учитываются до того, как происходит переход вправо от запятой.) Таким образом, переменная ounces инициализируется раньше переменной cost. В рассматриваемом примере порядок не имеет значения, однако он важен в ситуации, когда перменная ounces задействована в выражении для cost.. Для примера взгляните на следующее выражение:
Читать дальше