Вот эквивалентное определение серийного оператора for
в терминах традиционного цикла for
:
for (auto beg = v.begin(), end = v.end(); beg != end; ++beg) {
auto &r = *beg; //
r *= 2; //
}
Теперь, когда известно, как работает серийный оператор for
, можно понять, почему в разделе 3.3.2 упоминалось о невозможности его использования для добавления элементов к вектору или другому контейнеру. В серийном операторе for
кешируется значение end()
. Если добавить или удалить элементы из последовательности, сохраненное значение end()
станет неверным (см. раздел 3.4.1). Более подробная информация по этой теме приведена в разделе 9.3.6.
5.4.4. Оператор do while
do while
похож на оператор while
, но его условие проверяется после выполнения тела. Независимо от значения условия тело цикла выполняется по крайней мере однажды. Его синтаксическая форма приведена ниже.
do
while (условие);
do while
заканчивается точкой с запятой.
В цикле do while
выполняется прежде, чем
. Причем
не может быть пустым. Если
ложно, цикл завершается, в противном случае цикл повторяется. Используемые в условии переменные следует определить вне тела оператора do while
.
Напишем программу, использующую цикл do while
для суммирования любого количества чисел.
//
string rsp; //
//
do {
cout << "please enter two values: ";
int val1 = 0, val2 = 0;
cin >> val1 >> val2;
cout << "The sum of " << val1 << " and " << val2
<< " = " << val1 + val2 << "\n\n"
<< "More? Enter yes or no: ";
cin >> rsp;
} while (!rsp.empty() && rsp[0] != 'n');
Цикл начинается запросом у пользователя двух чисел. Затем выводится их сумма и следует запрос, желает ли пользователь суммировать далее. Ответ пользователя проверяется в условии. Если ввод пуст или начинается с n
, цикл завершается. В противном случае цикл повторяется.
Поскольку условие не обрабатывается до окончания оператора или блока, цикл do while
не позволяет определять переменные в условии.
do {
// ...
mumble(fоо) ;
} while (int foo = get_foo()); //
Если определить переменные в условии, то любое их использование произойдет
Упражнение 5.18. Объясните каждый из следующих циклов. Исправьте все обнаруженные ошибки.
(a) do
int v1, v2;
cout << "Please enter two numbers to sum:";
if (cin >> v1 >> v2)
cout << "Sum is: " << v1 + v2 << endl;
while (cin);
(b) do {
// ...
} while (int ival = get_response());
(c) do {
int ival = get_response();
} while (ival);
Упражнение 5.19. Напишите программу, использующую цикл do while
для циклического запроса у пользователя двух строк и указания, которая из них меньше другой.
5.5. Операторы перехода
Операторы перехода прерывают поток выполнения. Язык С++ предоставляет четыре оператора перехода: break
, continue
и goto
, рассматриваемые в этой главе, и оператор return
, который будет описан в разделе 6.3.
5.5.1. Оператор break
Оператор break
завершает ближайший окружающий оператор while
, do while
, for
или switch
. Выполнение возобновляется с оператора, следующего непосредственно за завершаемым оператором.
Оператор break
может располагаться только в цикле или операторе switch
(включая операторы или блоки, вложенные в эти циклы). Оператор break
воздействует лишь на ближайший окружающий цикл или оператор switch
.
string buf;
while (cin >> buf && !buf.empty()) {
switch(buf[0]) {
case '-':
// продолжать до первого пробела
for (auto it = buf.begin() + 1; it != buf.end(); ++it) {