Урок 67. Цикл while

   ⁄ 

 Обновлено 28 Июн 2017

  ⁄   

Цикл while является самым простым из четырех циклов, которые есть в C++, и очень похож на if:

while (условие)
    тело цикла;

Цикл while объявляется с использованием ключевого слова while. В начале цикла вычисляется условие. Если его значение true (не ноль), тогда выполняется тело цикла.

Однако, в отличие от оператора if, после завершения выполнения тела цикла управление возвращается обратно к while и процесс проверки условия повторяется. Если условие снова true, тогда тело цикла выполняется еще раз.

Например, следующая программа выводит все числа от 0 до 9:

Результат:

0 1 2 3 4 5 6 7 8 9 done!

Рассмотрим подробнее, что делает эта программа. Во-первых, инициализируется переменная: int count = 0;. Условие 0 < 10 имеет значение true, поэтому выполняется тело цикла. В первом стейтменте мы выводим 0, а во втором выполняем инкремент переменной count. Затем управление возвращается к началу цикла while для повторной проверки условия. Условие 1 < 10 имеет значение true, поэтому тело цикла выполняется еще раз. Тело цикла будет повторно выполняться до тех пор, пока переменная count не будет равна 10, и тогда значением условия 10 < 10 будет false, и цикл завершится.

Цикл while может и вообще не выполняться. Рассмотрим следующую программу:

Условие 15 < 10 сразу принимает значение false, и тело цикла пропускается. Единственное, что выведет эта программа:

done!

Бесконечные циклы

С другой стороны, если условие цикла всегда принимает значение true, то и сам цикл будет выполняться вечно. Это называется бесконечный цикл. Например:

Поскольку переменная count не увеличивается на единицу в этой программе, то условие count < 10 всегда будет true. Следовательно, цикл никогда не будет завершен, и программа будет постоянно выводить «0 0 0 0 0 … ».

Мы можем преднамеренно объявить бесконечный цикл следующим образом:

Единственный способ выйти из бесконечного цикла – использовать операторы return, break, exit, goto или выполнение исключения.

Программы, которые работают до тех пор, пока пользователь не решит остановить их, иногда преднамеренно используют бесконечные циклы вместе с операторами return, break или exit для завершения цикла. Распространена такая практика в серверных веб-приложениях, которые работают непрерывно и обслуживают веб-запросы.

Счетчик цикла

Часто мы хотим, чтобы цикл выполнялся определенное количество раз. Для этого обычно используется переменная в виде счетчика цикла. Счетчик цикла — это целочисленная переменная, которая объявляется с единственной целью: считать, сколько раз выполнился цикл. В примерах выше переменная count является счетчиком цикла.

Счетчикам цикла часто присваивают простые имена, такие как i, j или k. Однако, в этих именах есть одна серьезная проблема. Если вы захотите узнать, где в вашей программе используется счетчик цикла и воспользуетесь функцией поиска i, j или k, то в результате получите половину своей программы, так как i, j или k используются во многих словах. Следовательно, лучше использовать iii, jjj или kkk в качестве имен для счетчиков. Они более уникальны, их значительно проще найти и они выделяются из кода. А еще лучше использовать «реальные» имена для переменных, например count, или другое имя, которое дает более подробную информацию о том, что делает переменная.

Также для счетчиков цикла лучше использовать тип signed int. Использование unsigned int может привести к неожиданным результатам. Рассмотрим следующий код:

Взгляните на программу выше еще раз и постарайтесь обнаружить ошибку.

Оказывается, эта программа представляет собой бесконечный цикл. Она начинается с вывода «10 9 8 7 6 5 4 3 2 1 blastoff!» как и предполагалось, но затем уходит с рельсов и начинает отсчет с 4294967295. Почему? Потому что условие цикла count >= 0 никогда не будет ложным! Когда count равен 0, то условие 0 >= 0 имеет значение true, выводится «blastoff», а затем выполняется декремент переменной count, и происходит переполнение и значением переменной становится 4294967295. И так как условие 4294967295 >= 0 является истинным, то программа продолжается. А поскольку счетчик цикла типа unsigned, то он никогда не сможет быть отрицательным, и поскольку он никогда не сможет быть отрицательным, то цикл никогда не будет завершен.

Правило: Всегда используйте тип signed int для счетчиков цикла.

Итерации

Каждое выполнение цикла называется итерацией (повтором).

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

Для фундаментальных типов переменных это нормально. Для не фундаментальных типов переменных (таких как структуры или классы) это может сказаться на производительности. Следовательно, не фундаментальные типы переменных лучше определять перед циклом.

Обратите внимание, переменная count объявлена вне цикла. Это важно и необходимо, поскольку нам нужно, чтобы значение переменной сохранялось на протяжении всех итераций (не уничтожалось с каждым повтором цикла).

Часто мы хотим выполнить что-то, но только в определенном количестве итераций, например, сделать новую строку. Это легко осуществить, используя оператор модуля со счетчиком цикла:

Результат:

01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

Вложенные циклы

Также одни циклы могут быть вложены внутри других циклов. В следующем примере внутренний цикл и внешний цикл имеют свои собственные счетчики. Однако, обратите внимание, условие внутреннего цикла использует счетчик внешнего цикла!

Результат:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Тест

Задание №1

В программе выше, почему переменная inner объявлена внутри блока while, а не сразу после объявления переменной outer (вне блока while)?

Ответ 1

Переменная inner объявлена внутри блока while так, чтобы она была восстановлена (и повторно инициализирована до 1) каждый раз, когда выполняется внешний цикл. Если бы переменная inner была объявлена вне цикла while, то её значение никогда не было бы сброшено до 1, или нам бы пришлось сделать это самим с помощью операции присваивания. Кроме того, поскольку переменная inner используется только внутри внешнего цикла while, то имеет смысл объявить её там. Помните, что переменные нужно объявлять максимально близко к их первому использованию!

Задание №2

Напишите программу, которая выводит буквы английского алфавита от a до z вместе с кодами с таблицы ASCII. Подсказка: чтобы выводить символы как целые числа – используйте static_cast.

Ответ 2

Задание №3

Инвертируйте программу с последнего подзаголовка «Вложенные циклы» так, чтобы она выводила следующее:

5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

Ответ 3

Задание №4

Теперь сделайте, чтобы цифры выводились следующим образом:

        1
      2 1
    3 2 1
  4 3 2 1
5 4 3 2 1

Подсказка: Разберитесь сначала, как вывести числа так:

X X X X 1
X X X 2 1
X X 3 2 1
X 4 3 2 1
5 4 3 2 1

Ответ 4

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *