Изучаем C++. Часть 6. Циклы while, do-while и for

Разбираемся, как сократить повторяющийся код в C++ и сэкономить время.

Это шестая часть из серии статей «Глубокое погружение в C++». В прошлый раз мы узнали, как использовать функции и процедуры. Сейчас поговорим о циклах while, do-while и for.

Циклы — это разновидность условных конструкций. Они позволяют выполнять команды несколько раз, если определённое утверждение верно. Например, с помощью циклов можно пять раз вывести на экран какую-нибудь надпись или посчитать сумму всех чисел.

Евгений Кучерявый

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.


Цикл while в C++

Запись цикла while выглядит так:

Этот код выполняется следующим образом:

  1. Программа проверяет, верно ли утверждение.
  2. Выполняются инструкции в теле цикла.
  3. Программа возвращается к пункту 1.

То есть пока утверждение верно (i < 100), цикл будет повторять одни и те же действия. Цикл, который пять раз выводит сообщение «Hello, World!»:

int i = 0;

while(i < 5)
{
    std::cout << "Hello, World! \n";
    i++;
}

Посмотрим на вывод:

Обратите внимание на переменную i — она играет роль счётчика, к которому в каждом шаге цикла прибавляется единица. Это нужно, чтобы инструкции выполнялись только определённое количество раз.

Один шаг цикла называется итерацией, а счётчик — итератором. Поэтому чаще всего для счётчика создаётся переменная i.

Важно! Следите за тем, чтобы выход из цикла был возможен, иначе он будет выполняться бесконечно.

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

Когда нам нужно вмешаться в работу цикла, мы используем операторы break и continue.

Оператор break

Оператор break прерывает выполнение цикла:

int sum = 0;
int maxSum = 50;
int i = 0;

while(i < 100)
{
    sum += i;

    i++;

    if(sum >= maxSum)
    {
   	 break;
    }
}

std::cout << "i = " << i << "\nsum = " << sum << "\n";

Этот цикл должен посчитать сумму всех чисел от одного до ста. Но мы указали максимальное значение для переменной sum, поэтому цикл прервётся, как только sum станет больше maxSum.

Компилятор умеет отличать оператор break в конструкции switch от оператора break, который прерывает циклы. Поэтому можно спокойно писать вот такой код:

int action = 0;
bool end = false;

//Этот цикл будет бесконечным, если его не прервать изнутри
while(true)
{
    std::cout << "Exit? \n1 - Yes\n0 - No\nAction: ";
    std::cin >> action;

    switch(action)
    {
   	 case 1:
   		 std::cout << "Good bye!\n";
   		 end = true;
   		 break;
   	 case 0:
   		 std::cout << "Try again!\n";
    }

    if(end)
    {
   	 break;
    }
}

Вот как это будет работать:

Важно! Оператор break внутри конструкции switch не может прервать цикл.

Оператор continue

Иногда нам нужно пропустить одну итерацию и перейти к следующей. Для этого используем оператор continue.

int i = 0;

while(i < 100)
{
    i++;

    //
    if(i % 3 == 0)
    {
   	 continue;
    }

    std::cout << " " << i;
}

std::cout << "\n";

Этот цикл выведет все числа от одного до ста, кроме тех, которые делятся на три без остатка.

Цикл do-while в C++

Цикл do-while похож на while, но он сначала выполняет одну итерацию и только потом проверяет верность утверждения:

while(false)
{
    //Ничего не выводится
    std::cout << "Hello! \n";
}

do
{
    //Надпись будет выведена один раз
    std::cout << "Bye! \n";
}
while(false);

Вот результат:

Цикл for в C++

Если для работы цикла нужен счётчик, то его запись можно сократить с помощью цикла for, записав логику в скобки:

Вот пример такого цикла:

int sum = 0;

for(int i = 0; i < 200; i++)
{
    sum += i;
}

std::cout << "sum = " << sum << "\n";

В результате мы получим сумму всех чисел от 1 до 200:

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

Циклы, как и другие конструкции, можно размещать внутри других циклов. Вот, например, как вывести сетку с помощью for:

for(int i = 0; i < 10; i++)
{
    //Обратите внимание, что во вложенном цикле должен использоваться другой итератор. В данном случае j вместо i
    for(int j = 0; j < 10; j++)
    {
   	 std::cout << " + ";
    }
    std::cout << "\n";
}

Получаем результат:

Важно! Операторы break и continue влияют на тот цикл, в котором они находятся, а не на родительский.

Заключение

Циклы — одни из самых часто используемых конструкций в программировании. Они нужны при чтении данных из файлов, сортировке, отрисовке графики и так далее. Одно из самых полезных применений циклов связано с массивами, о работе с которыми будет отдельная статья.

Если вы хотите изучить самые востребованные особенности C++ и стать профессиональным программистом, то записывайтесь на наш курс по разработке на C++. Вы не только изучите теорию, но и выполните массу практических заданий, получите по ним обратную связь и сможете избежать тонны ошибок.

Курс

Профессия
Разработчик на C++ с нуля


Вы пройдёте полный курс по С++ и прикладной курс по Unreal Engine 4. Вы научитесь работать с многопоточностью, использовать инструменты и средства разработки: Git, GCC, GDB. Вам будет проще найти работу программиста в геймдеве.

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox