повторно проверяет условие. Если новое значение переменной >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
>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
.
Когда объект типа >istream
используется при проверке условия, результат зависит от состояния потока. Если поток допустим, т.е. не столкнулся с ошибкой и ввод следующего значения еще возможен, это условие считается истинным. Объект типа >istream
переходит в недопустимое состояние по достижении конца файла (end-of-file) или при вводе недопустимых данных, например строки вместо числа. Недопустимое состояние объекта типа >istream
в условии свидетельствует о том, что оно ложно.