1.4.2. Оператор for

В рассмотренном ранее цикле while для управления количеством итераций использовалась переменная val. Мы проверяли ее значение в условии, а затем в теле цикла while увеличивали его.

Такая схема, подразумевающая использование переменной в условии и ее инкремент в теле столь популярна, что было разработано второе средство управления — оператор for, существенно сокращающий подобный код. Используя оператор for, можно было бы переписать код программы, суммирующей числа от 1 до 10, следующим образом:

#include <iostream>

int main() {

 int sum = 0;

 // сложить числа от 1 до 10 включительно

 for (int val = 1; val <= 10; ++val)

  sum += val; // эквивалентно sum = sum + val

 std::cout << "Sum of 1 to 10 inclusive is "

           << sum << std::endl;

 return 0;

}

Как и прежде, определяем и инициализируем переменную sum нулевым значением. В этой версии мы определяем переменную val как часть самого оператора for.

for (int val = 1; val <= 10; ++val)

 sum += val;

У каждого оператора for есть две части: заголовок и тело. Заголовок контролирует количество раз выполнения тела. Сам заголовок состоит из трех частей: оператора инициализации, условия и выражения. В данном случае оператор инициализации определяет, что объекту val типа int присвоено исходное значение 1:

int val = 1;

Переменная val существует только в цикле for; ее невозможно использовать после завершения цикла. Оператор инициализации выполняется только однажды перед запуском цикла for.

Условие сравнивает текущее значение переменной val со значением 10:

val <= 10

Условие проверяется при каждом цикле. Пока значение переменной val меньше или равно 10, выполняется тело цикла for.

Выражение выполняется после тела цикла for. В данном случае выражение использует префиксный оператор инкремента, который добавляет 1 к значению переменной val:

++val

После выполнения выражения оператор for повторно проверяет условие. Если новое значение переменной val все еще меньше или равно 10, то тело цикла for выполняется снова. После выполнения тела значение переменной val увеличивается снова. Цикл продолжается до нарушения условия.

В рассматриваемом цикле for тело осуществляет суммирование.

sum += val; // эквивалентно sum = sum + val

В итоге оператор for выполняется так.

1. Создается переменная val и инициализируется значением 1.

2. Проверяется значение переменной val (меньше или равно 10). Если условие истинно, выполняется тело цикла for, в противном случае цикл завершается и управление переходит к оператору, следующему за ним.

3. Приращение значения переменной val.

4. Пока условие истинно, повторяются действия, начиная с пункта 2.

Упражнения раздела 1.4.2

Упражнение 1.12. Что делает следующий цикл for? Каково финальное значение переменной sum?

int sum = 0;

for (int i = -100; i <= 100; ++i)

 sum += i;

Упражнение 1.13. Перепишите упражнения раздела 1.4.1, используя циклы for.

Упражнение 1.14. Сравните циклы с использованием операторов for и while в двух предыдущих упражнениях. Каковы преимущества и недостатки каждого из них в разных случаях?

Упражнение 1.15. Напишите программы, которые содержат наиболее распространенные ошибки, обсуждаемые во врезке «Ввод конца файла с клавиатуры». Ознакомьтесь с сообщениями, выдаваемыми компилятором.