Сложные выражения с оператором for
При профессиональном использовании цикл for становится мощным и гибким инструментом программирования. Тот факт, что оператор for допускает установку трех независимых параметров цикла (инициализацию, условие продолжения и шаг), открывает неограниченные возможности в управлении работой цикла.
Параметры цикла for
Синтаксис установок параметров цикла for следующий:
for (инициализация, проверка, операция)
выражения;
Выражение инициализации используется для установки начального значения счетчика цикла или для выполнения какой-нибудь другой операции, подготавливающей работу цикла. Под проверкой понимают некое выражение на языке C++, которое выполняется перед каждой новой итерацией цикла и возвращает логическое значение. Если возвращается значение true, то программа выполняет строки тела цикла. после чего выполняется третье выражение в параметрах цикла, которое, как правило/приращивает значение счетчика на заданную величину.
Пример 1:
// напечатать Hello десять раз
for(int 1=0; i<10; i++)
cout << "Hello!" << endl;
Пример 2:
for(int 1=0; i<10; i++)
{
cout << "Hello!" << endl;
cout << "the value of i is: " << i << endl;
}
Цикл for работает в такой последовательности:
1. Присваивается начальное значение счетчику цикла.
2. Вычисляется значения выражения, устанавливающего условие продолжения цикла.
3. Если выражение условия возвращает true, то сначала выполняется тело цикла, а затем заданная операция над счетчиком цикла.
На каждой итерации шаги 2 и 3 повторяются.
Множественные инициализации и приращения счетчиков цикла
Синтаксис задания цикла for позволяет инициализировать несколько переменных- счетчиков, проверять сложные условия продолжения цикла или последовательно выполнять несколько операций над счетчиками цикла. Если присваиваются значения нескольким счетчикам или выполняется несколько операций, они записываются последовательно и разделяются запятыми. В листинге 7.10 инициализируются два счетчика, значения которых после каждой итерации увеличиваются на единицу.
Листинг 7.10. Использование нескольких счетчиков в цикле for
1: // Листинг 7.10.
2: // Использование нескольких счетчиков
3: // в цикле for
4:
5: #include <iostream.h>
6:
7: int main()
8: {
9: for (int i=0, j=0; i<3; i++, j++)
10: cout << "i: " << i << " j: " << j << endl;
11: return 0;
12: }
Результат:
i: 0 j: 0
i: 1 j: 1
i: 2 j: 2
Анализ: В строке 9 переменные i и j инициализируются нулевыми значениями. Затем проверяется условие i<3 и, так как оно справедливо, выполняется первая итерация цикла. На каждой итерации осуществляется вывод значений счетчиков на экран. После этого выполняется третья часть конструкции for, в которой значения переменных-счетчиков увеличиваются на единицу. После выполнения строки 10 и изменения значений переменных условие проверяется снова. Если условие все еще справедливо, запускается следующая итерация цикла. Это происходит до тех пор, пока условие продолжения цикла не нарушится. В этом случае значения переменных не изменяются и управление передается следующему после цикла оператору.
Нулевые параметры цикла for
Любой параметр цикла for может быть опущен. Пропуск означает использование так называемого нулевого параметра. Нулевой параметр, как и любой другой, отделяется от остальных параметров цикла for символом точки с запятой (;). Если опустить первый и третий параметры цикла for, как показано в листинге 7.11, результат его применения будет аналогичен полученному при использовании оператора while.
Листинг 7.11. Нулевые параметры цикла for
1: // Листинг 7.11.
2: // Нулевые параметры цикла for
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter = 0;
9:
10: for( ; counter < 5; )
11: {
12: counter++;
13: cout << "Looping! ";
14: }
15:
16: cout << "\nCounter: " << counter << ".\n";
17: return 0;
18: }
Результат:
Looping! Looping! Looping! Looping! Looping!
Counter: 5.
Анализ: Очевидно, что результат выполнения такого цикла в точности совпадает с результатом выполнения цикла while из листинга 7.8. В строке 8 присваивается значение переменной counter. Установки параметров цикла for, показанные в строке 10, содержат только проверку условия продолжения цикла. Операция над переменной цикла в конструкции for также опущена. Таким образом, этот цикл можно представить в виде
while (counter < 5).
Рассмотренный пример еще раз показывает, что возможности языка C++ позволяют решить одну и ту же задачу множеством способов. Листинг 7.11 приведен скорее для иллюстрации гибкости возможностей C++, поскольку ни один опытный программист не будет использовать цикл for подобным образом. Тем не менее можно опустить даже все три параметра цикла for, а для управления циклом использовать операторы break и continue. Пример использования конструкции for без параметров приведен в листинге 7.12.
Листинг 7.12. Использование оператора for без параметров
1: //Листинг 7.12.
2: // Использование оператора for без параметров
3:
4: #include <iostream.h>
5:
6: int nain()
7: {
8: int counter=0; ,// установка начального значения счетчика
9: int max;
10: cout << " How many hellos?";
11: cin >> max;
12: for (;;) // задание бесконечного цикла
13: {
14: if (counter < max) // проверка значения
15: {
16: cout << "Hello!\n";
17: counter++; // приращение значения счетчика
18: }
19: else
20: break;
21: }
22: return 0;
23: }
Результат:
How many hellos?
Hello!
Hello!
Hello!
Анализ: В этом примере набор параметров оператора for максимально минимизирован. Опущены все три параметра — инициализация, условие и операция. Начальное значение счетчика присваивается в строке 8 еще до начала работы цикла. Условие продолжения цикла также проверяется в отдельной строке (строка 14), и, если оно истинно, выполняется операция тела цикла, после чего в строке 17 увеличивается значение счетчика. Если условие не выполняется, оператор break в строке 20 прерывает выполнение цикла.
Несмотря на то что рассмотренная программа выглядит достаточно нелепо, встречаются ситуации, когда конструкции for(;;) и while(true) оказываются просто необходимыми. Более полезный пример использования таких конструкций будет приведен далее в этой главе после рассмотрения оператора switch.