
- •Циклы Цикл for
- •Части цикла for
- •Выражения и операторы
- •Не выражения и операторы
- •Отклонения от правил
- •Изменение шага цикла
- •Доступ внутрь строк с помощью цикла for
- •Операции инкремента и декремента
- •Комбинация операций присваивания
- •Составные операторы, или блоки
- •Выражения отношений
- •Цикл while
- •Сравнение циклов for и while
- •Цикл do while
Отклонения от правил
Язык C++ добавляет к циклам С возможность, которая требует некоторой поправки к синтаксису цикла for. Исходный синтаксис выглядел следующим образом:
for (выражение; выражение; выражение) оператор
В частности, управляющий раздел конструкции for состоял из трех выражений, разделенных точками с запятой, как это указывалось ранее в настоящей главе. Однако циклы C++ позволяют поступать так, как показано ниже:
for (int i = 0; i < 5; i ++)
To есть в области инициализации цикла for можно объявить переменную. Часто поступать подобным образом очень удобно, но это не вписывается в исходный синтаксис, поскольку объявление не является выражением. Это единственное незаконное поведение, которое подгонялось под правила за счет определения нового вида выражений — выражения оператора объявления, которое представляло собой объявление без точки с запятой и могло встречаться только в операторе for.
С объявлением переменной внутри for связан один практический аспект, о котором вы должны знать. Такая переменная существует только внутри оператора for. То есть после того, как программа покидает цикл, переменная исчезает:
for (int i = 0; i < 5; i++)
cout << "C + + knows loop.\n";
cout << i << endl; //переменная i больше не определена
Код в листинге далее использует цикл для вычисления и сохранения первых 16 факториалов. Факториалы, которые являются удобным примером автоматизации обработки, вычисляются следующим образом.
Ноль факториал, записываемый как 0!, определен как равный 1.
Далее, 1! равен 1*0!, т.е. 1.
2! равно 2*1!, или 2.
3! равно 3*2!, или 6, и т.д.
То есть факториал каждого целого числа равен произведению этого числа на факториал предыдущего числа. В программе один цикл используется для вычисления значений последовательных факториалов, с сохранением их в массиве. Второй цикл служит для отображения результатов. Также программа демонстрирует применение внешних объявлений для значений.
#include <iostream>
const int ArSize = 16;
int main()
{
using namespace std;
long long factorials[ArSize];
factorials[1] = factorials[0] = 1LL;
for (int i = 2; i < ArSize; i++)
factorials[i] = i * factorials[i-1];
for (int i = 0; i < ArSize; i++)
cout << i << "! = " << factorials[i] << endl;
getchar();
return 0;
}
Цикл иллюстрирует возможность применения счетчика цикла в его теле как переменной.
Программа из листинга демонстрирует, как цикл for работает рука об руку с массивами, предоставляя удобное средство доступа к каждому члену массива по очереди. К тому же используется const для создания символического представления (ArSize) для размера массива.
После этого ArSize применяется везде, где вступает в игру размер массива — в определении массива, а также в выражении, ограничивающем количество шагов циклов, обрабатывающих массив.
Если теперь вы решите расширить программу для вычисления, скажем, 20 факториалов, для этого понадобится только установить ArSize в 20 и перекомпилировать программу. Благодаря использованию символической константы, вы избегаете необходимости изменять индивидуально каждое вхождение 16 на 20.
Ограничивающее выражение i < ArSize отражает тот факт, что индексы элементов массива лежат в пределах от 0 до ArSize - 1, т.е. значение индекса должно останавливаться за один шаг до достижения ArSize. Вместо него можно было бы использовать проверочное условие i <= ArSize - 1.