Использование конструкции while(true)

В качестве условия, проверяемого при переходе на очередную итерацию цикла, может выступать любое выражение, корректное с точки зрения синтаксиса языка C++. Цикл выполняется до тех пор, пока это выражение истинно. Для организации так называемых бесконечных циклов в качестве такого выражения применяется логическая константа true. Листинг 7.5 демонстрирует пример бесконечного цикла, выполняющего счет до десяти.

Листинг 7.5. Еще один пример использования оператора while

1: // Листинг 7.5.

2: // Пример "бесконечного" цикла

3:

4: #include <iostream.h>

5:

6: int main()

7: {

8: int counter = 0;

9:

10: while (true)

11: {

12: counter++;

13: if (counter > 10)

14: break;

15: }

16: cout << "Counter: " << counter << "\n";

17: return 0;

18: }

Результат:

Counter: 11

Анализ: Понятно, что условие продолжения цикла, заданное в строке 10, будет выполняться всегда. В теле цикла (строка 12) значение переменной counter увеличивается на единицу. Работа цикла продолжается до тех пор, показначение counter не превысит 10. Выполнение цикла прерывается оператором break в строке 14, и на экран выводится значение переменной counter (строка 16).

Несмотря на то что данная программа работает, ее структуру нельзя назвать оптимальной. Это типичный пример некорректного использования оператора while. Правильным решением была бы организация проверки значения counter в условии продолжения цикла.

Гибкий синтаксис языка C++ позволяет решить одну и ту же задачу множеством различных способов. Поэтому важно научиться выбирать средство, наиболее подходящее в конкретной ситуации.

Организация циклов с помощью конструкции do...while

При организации циклов с помощью оператора while возможна ситуация, когда тело цикла вообще не будет выполняться. Поскольку условие продолжения цикла проверяется в начале каждой итерации, при нарушении истинности выражения, задающего это условие, выполнение цикла будет прервано еще до запуска первого оператора тела цикла. Пример такой ситуации приведен в листинге 7.6.

Листинг 7.6. Преждевременное завершение цикла с while

1: // Листинг 7.6.

2: // Если условие продолжения цикла не выполняется,

3: // тело цикла пропускается.

4:

5: #include <iostream.h>

6:

7: int main()

8: {

9: int counter;

10: cout << "How many hellos?: ";

11: cin >> counter;

12: while (counter > 0)

13: {

14: cout << "Hello!\n";

15: counter--;

16: }

17: cout << "Counter is OutPut: " << counter;

18: return 0;

19: }

Результат:

How many hellos?: 2

Hello!

Hello!

Counter is 0utPut: 0

How many hellos?: 0

Counter is 0utPut: 0

Анализ: В строке 10 вам предлагается ввести начальное значение счетчика, которое записывается в переменную counter. В строке 12 это значение проверяется, а затем в теле цикла уменьшается на единицу. При первом запуске программы начальное значение счетчика равнялось двум, поэтому тело цикла выполнялось дважды. Во втором случае было введено число 0. Понятно, что в этом случае условие продолжения цикла не выполнялось и тело цикла было пропущено. В результате приветствие не было выведено ни разу.

Как же поступить, чтобы сообщение выводилось по крайней мере один раз? С помощью оператора while это сделать невозможно, так как условие проверяется еще до выполнения тела цикла. Один из способов решения этой проблемы — использование оператора if для контроля начального значения переменной counter.

If (counter < 1) // контроль начального значения

counter = 1;

Правда, это довольно <<корявый>> выход из ситуации.

Использование конструкции do...while

При использовании конструкции do...while условие проверяется после выполнения тела цикла. Это гарантирует выполнение операторов цикла по крайней мере один раз. В листинге 7.7 приведен измененный вариант предыдущей программы, в котором вместо оператора while используется конструкция do...while.

Листинг 7.7. Использование конструкции do...while

1: // Листинг 7.7.

2: // Пример использования конструкции do...while

3:

4: include <iostream.h>

5:

6: int main()

7: {

8: int counter;

9: cout << "How many hellos? ";

10: cin >> counter;

11: do

12: {

13: cout << "Hello\n";

14: counter--;

15: } while (counter >0 );

16: cout << "Counter is: " << counter << endl;

17: return 0;

18: }

Результат:

How many hellos? 2

Hello

Hello

Counter is: 0

Анализ: В строке 9 пользователю предлагается ввести начальное значение счетчика, которое записывается в переменную counter. В конструкции do.. while условие проверяется в конце каждой итерации, что гарантирует выполнение тела цикла по меньшей мере один раз. В строке 13 на экран выводится текст приветствия, а в строке 14 значение переменной counter уменьшается на единицу. Условие продолжения цикла проверяется в строке 15. Если оно истинно, выполняется следующая итерация цикла ,(строка 13). В противном случае цикл завершается и управление передается в строку 16.

При использовании в конструкциях do.. .while операторы break и continue дают тот же результат, что и при использовании с оператором while. Единственное различие этих двух методов организации циклов состоит в проверке условия продолжения цикла. В первом случае оно контролируется перед выполнением тела цикла, а во втором — после него.

Оператор for

Для организации цикла с помощью оператора while необходимо выполнить три обязательных действия: установить начальные значения переменных цикла, а затем на каждой итерации проконтролировать выполнение условия продолжения цикла и изменить значение переменной цикла (листинг 7.8).

Листинг 7.8. Еще один пример использования оператора while

1: // Листинг 7.8.

2: // Еще один пример использования оператора while

3:

4: #include <iostream.h>

5:

6: int main()

7: {

8: int counter = 0;

9:

10: while(counter < 5)

11: {

12: counter++;

13: cout << " Looping! ";

14: }

15:

16: cout << "\nCounter: " << counter << " \n";

17: return 0;

18: }

Результат:

Looping! Looping! Looping! Looping! Looping!

Counter: 5.

Анализ: В строке 8 переменная цикла counter инициализируется нулевым значением. Затем в строке 10 проверяется условие продолжения цикла, а в строке 12 значение счетчика увеличивается на единицу. В строке 13 на экран выводится сообщение, наглядно иллюстрирующее циклический процесс. Конечно, в цикле вашей программы могут выполняться и более серьезные операции.

Оператор for позволяет объединить три операции, необходимые для работы цикла, в одну. Кратко эти операции можно охарактеризовать так: инициализация, проверка условия и приращение счетчика цикла. Выражение с оператором for состоит из самого этого оператора, за которым в круглых скобках следуют три выражения, устанавливающих параметры выполнения цикла. Выражения в круглых скобках разделяются символами точки с запятой.

Первое выражение цикла for устанавливает начальное значение счетчика цикла. Счетчик, как правило, представляет собой целочисленную переменную, которая объявляется и инициализируется прямо в цикле for, хотя в C++ допускается использование в этом месте любого выражения, выводящего начальное значение счетчика каким-то косвенным путем. Второй параметр цикла for определяет условие продолжения цикла, которое также может быть представлено любым выражением. Это условие выполняет те же функции, что и в конструкции while. Третий параметр устанавливает значение приращения счетчика цикла (по умолчанию шаг приращения равен единице). В этой части также может использоваться любое корректное выражение или оператор C++. Нужно заметить, что, хотя параметры цикла for могут задаваться любыми корректными выражениями C++, для установки второго параметра обязательно должно использоваться выражение, возвращающее логическое значение. Пример использования цикла for приведен в листинге 7.9.

Листинг 7.8. Пример использования цикла for

1: // Листинг 7.9.

2: // Пример использования цикла for

3:

4: #include <iostream.h>

5:

6: int main()

7: {

8: int counter;

9: for (counter = 0; counter < 5; counter++)

10: cout << " Looping! ";

11:

12: cout << "\nCounter: " << counter << ".\n";

13: return 0;

14: }

Результат:

Looping! Looping! Looping! Looping! Looping!

Counter: 5.

Анализ: В строке 9 программы с помощью оператора for задается цикл, отсчитывающий число итераций с помощью переменной counter. После каждого цикла проверяется условие продолжения цикла и значение переменной counter увеличивается на единицу. Тело цикла состоит из одного оператора, записанного в строке 10. В реальных программах тело цикла может состоять из любого количества операторов.

Наши рекомендации