В языке с ++ есть несколько способов организации циклов. Самый простой из них это так называемый цикл с предусловием.
while
Как можно понять их названия цикл с предусловием, прежде чем цикл будет выполняться, проверяется некое условие.
Вот синтаксис этого цикла:
Code
while( условие ) { Тело цикла }
Слово while – переводится с английского как "пока", а всю логику цикла можно передать так. Пока условие истинно, блок кода, содержащийся в теле цикла(это такой термин), будет выполнен, и если условие продолжает оставаться истинным, он будет выполнен снова и снова. Поэтому если необходимо завершить цикл, нужно изменить условие так, чтобы оно стало ложным, ну или оно станет ложным в процессе, или воспользоваться уже знаком нам оператором break. Вот два примера. Первый, где меняется условие:
Code
#include <iostream> using namespace std;
void main () { setlocale( LC_ALL, "Russian" );
int i=0; // переменная для подсчета циклов while(i<100000) // если i меньше 100000, цикл выполняется { i++; // счетчик циклов увеличивается на единицу }
cout<<"Все. Нажмите Enter для выхода..."; // это, чтобы мы знали, что циклы закончились cin.get(); }
Здесь, как только цикл выполнится определенное количество раз, постепенно увеличивающаяся переменная изменит условие продолжения цикла, и он больше не будет выполняться.
Второй, с использованием оператора break:
Code
#include <iostream> using namespace std;
void main () { setlocale( LC_ALL, "Russian" );
int i=0; // переменная для подсчета циклов while(true) // бесконечный цикл { if (i==100000) // если выполнено 100000 циклов break; // цикл прерывается i++; // иначе счетчик циклов увеличивается на единицу }
cout<<"Все. Нажмите Enter для выхода..."; // это, чтобы мы знали, что циклы закончились cin.get(); }
ПОДОБНЫЙ СПОСОБ ЗАВЕРШЕНИЯ ЦИКЛА Я НЕ РЕКОМЕНДУЮ. Лучше опираться только на условие, иначе чревато разного рода неприятностями.
В последнем примере также продемонстрирован способ организации бесконечного цикла:
Code
while(true)
Здесь условие уже определено как истинное, и изменить его невозможно, следовательно выйти из этого цикла можно только с помощью break или return, но последняя инструкция вообще завершит работу программы.
do…while
У цикла с предусловием есть брат, которого называют цикл с постусловием. Отличаются они тем, что в цикле с предусловием это самое условие проверяется с самого начала, и если оно ложно, цикл выполняться не будет вообще, тогда как проверка условия в цикле с постусловием происходит только после его первого выполнения. То есть, в не зависимости от условия, цикл будет выполнен как минимум один раз. Бывают моменты, когда подобное необходимо. Во всем остальном эти циклы идентичны. Вот синтаксис:
Code
do { Тело цикла } while(условие);
Обратите внимание. Здесь после
Code
while(условие);
обязательно ставится точка с запятой, тогда как в предыдущем варианте ее не было. Если ее не поставить, компилятор сообщит об ошибке.
for
Приводя примеры для предыдущих циклов, я использовал в программе счетчики. Следующий способ организации цикла уже предполагает подобного счетчика. Если предыдущие циклы могли выполнятся неопределенное количество раз, то в цикле с использованием оператора for количество повторений задается с самого начала. Кстати, именно этому циклу отдает предпочтение большинство программистов.
Синтаксис таков:
Code
for(инициализация счетчиков; условие; увеличение счетчика) { Тело цикла }
Как видно непосредственно в операторе for происходит инициализация счетчика, там же выполняется проверка условия, и там же происходит увеличение счетчика. Все собрано в одном месте, что, несомненно, очень удобно. Этот синтаксис можно заменить аналогичной записью цикла while:
Code
инициализация счетчиков while( условие ) { { Тело цикла } увеличение счетчика }
И подобный вариант уже был проиллюстрирован в примере. А теперь приведу пример, чтобы лучше понять цикл for:
Code
#include <iostream> using namespace std;
void main () { setlocale( LC_ALL, "Russian" );
for(int i=0;i<20;i++) { cout<<i<<"\n"; // вывод значения счетчика }
cout<<"Все. Нажмите Enter для выхода..."; // это, чтобы мы знали, что циклы закончились cin.get(); }
Опишу как этот пример работает. В операторе for в месте для инициализации объявляется переменная i, которой сразу же присваивается начальное значение 0. Эта часть цикла будет выполнена только один раз. Далее происходит проверка условия, в данном случае это i<20. В данный момент оно истинно, поэтому выполняется тело цикла со следующим кодом:
Code
cout<<i<<"\n"; // вывод значения счетчика
здесь просто выводится текущее значение счетчика. После этого выполняется последняя часть оператора for, в которой значение счетчика увеличивается на единицу.
Code
i++
Далее вновь проверяется условие и если оно по-прежнему истинно – все повторяется.
Отмечу, что как в случае с while, условие в цикле for не обязательно должно относится к счетчикам. Как и с оператором while, с оператором for также возможна организация бесконечного цикла. Для этого достаточно оставить все поля пустыми:
Code
for(;;) { Тело цикла }
При работе с циклом for используется еще один оператор – continue. С английского переводится - "продолжить", и делает он то же, что и означает. Как только в теле цикла встречается этот оператор, оставшийся код пропускается и программа переходит к оператору увеличения счетчика. Приведу пример:
Code
for(int i=0;i<4;i++) { if(i==2) // если i равно 2 continue; // срабатывает этот оператор
cout<<i<<"\n"; // вывод значения счетчика }
Здесь, когда i станет равно 2, сработает оператор continue, в результате чего строка
Code
cout<<i<<"\n"; // вывод значения счетчика
будет опущена, и цикл начнется заново с увеличенным на единицу значением i. Это если условие не станет ложным.
Я продемонстрировал вам способы организации бесконечных циклов, но знайте, что нужно быть очень внимательным, чтобы такой вот бесконечный цикл не возник сам по себе. Это часто встречающийся баг, когда программа уходит сама в себя войдя в цикл и не найдя с него выхода.
Ну и напоследок отмечу, что все циклы взаимозаменяемы. Просто в одном месте удобнее использовать while, а в другом for. Ну и от личных пристрастий программистов это тоже сильно зависит.