Выбрать главу

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. Напишите программы, которые содержат наиболее распространенные ошибки, обсуждаемые во врезке «Ввод конца файла с клавиатуры». Ознакомьтесь с сообщениями, выдаваемыми компилятором.

1.4.3. Ввод неизвестного количества данных

В приведенных выше разделах мы писали программы, которые суммировали числа от 1 до 10. Логическое усовершенствование этой программы подразумевало бы запрос суммируемых чисел у пользователя. В таком случае мы не будем знать, сколько чисел суммировать. Поэтому продолжим читать числа, пока будет что читать.

#include <iostream>

int main() {

 int sum = 0, value = 0;

 // читать данные до конца файла, вычислить сумму всех значений

 while (std::cin >> value)

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

 std::cout << "Sum is: " << sum << std::endl;

 return 0;

}

Если ввести значения 3 4 5 6, то будет получен результат Sum is: 18.

Первая строка функции main() определяет две переменные типа int по имени sum и value, инициализируемые значением 0. Переменная value применяется для хранения чисел, вводимых в условии цикла while.

while (std::cin >> value)

Условием продолжения цикла while является выражение

std::cin >> value

Это выражение читает следующее число со стандартного устройства ввода и сохраняет его в переменной value. Как упоминалось в разделе 1.2, оператор ввода возвращает свой левый операнд. Таким образом, в условии фактически проверяется объект std::cin.