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.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
.