Циклы

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

Цикл с предусловием while

Условие проверяется перед выполнением тела цикла. Если условие ложно, то цикл не выполнится.

int count = 10;
while(count > 0)      // Цикл выполняется, пока условие истинно
{
    std::cout << count << endl;
    count--;
}

Цикл с постусловием do-while

Условие проверяется после выполнения тела цикла. Цикл выполнится как минимум один раз.

int count = 10;
do
{
    std::cout << count << endl;
    count--;
} while(count > 0)    // Цикл выполняется, пока условие истинно

Цикл for

Цикл с заранее заданными условиями и количеством итераций.

for (int i = 0; i < 10; i++)     // Цикл от 0 до 9
{
    std::cout << i << endl;
}

В цикле for задаются три блока параметров, разделенных точкой с запятой:

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

В блоках можно использовать несколько параметров через запятую.

for (int i = 0, j = 1; i <= 5; i++, j *= i)    // Несколько параметров через запятую
{
    std::cout << i << "-" << j << ", ";
}

Любой блок оператора for может отсутствовать.

int index = 10;
for (; index > 0;)             // Указан только один блок условий
{
    cout << index << endl;
    index--;
}

Переменные, объявленные в цикле, существуют только внутри цикла. В старых версиях языка C++ переменные сохранялись после выхода из цикла.

Цикл по диапазону

В стандарте C++11 появились новые виды циклов - range-based циклы, в которых переменная пробегает по всем значением контейнера. Контейнер должен поддерживать методы begin() и end() - это может быть vectorlistsetmap и массив. Цикл по диапазону не дает возможности узнать индекс текущего элемента, так как в большинстве контейнеров не существует индекса, как такового.

int arr[] = { 1, 2, 3, 4, 5};
for (int elem : arr)
{
    std::cout << elem << ' ';   // 1 2 3 4 5
}

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

int arr[] = { 1, 2, 3, 4, 5};
for (int &elem : arr)
{
    elem *= 2;
    std::cout << elem << ' ';   // 2 4 6 8 10
}

Управление выполнением циклов

Прервать выполнение цикла можно с помощью команды break

for (int i = 0; i < 10; i++)
{
    std::cout << i << endl;  // Команда выполнится один раз
    break;                   // Выход из цикла
}

С помощью команды continue можно сразу перейти к следующей итерации цикла

for (int i = 0; i < 10; i++)
{
    continue;                // Переход к следующей итерации цикла
    std::cout << i << endl;  // Команда никогда не выполнится
}

Ветвления

Ветвления позволяют выполнять различные участки кода в зависимости от заданных условий.

Конструкция if-else

Оператор if позволяет выполнить блок кода, если условие истинно.

if (a > 3)
{
    cout << "число больше 3" << endl;
}

Оператор if-else позволяет выполнить первый блок кода, если условие истинно, и второй блок, если условие ложно.

if (a % 2 == 0)
{
    cout << "четное" << endl;
}
else
{
    cout << "нечетное" << endl;
}

Однострочные блоки можно указывать без фигурных скобок

if (a % 2 == 0)
    cout << "четное" << endl;
else
    cout << "нечетное" << endl;

Последовательное указание условий можно сделать через конструкцию else if.

if (x > 5)
    cout << "X больше 5" << endl;
else if (x < 5)
    cout << "X меньше 5" << endl;
else
    cout << "X равен 5" << endl;

Конструкция switch...case

Блоки кода выполняются в зависимости от указанных значений

switch (x)
{
case 1:
    cout << "X равен 1" << endl;
    break;
case 2:
    cout << "X равен 2" << endl;
    break;
}

Если в блоке не указан break, то будет выполнен следующий блок

switch (x)
{
case 1:
    cout << "X равен 1" << endl;
    break;
case 2:
case 3:
    cout << "X равен 2 или 3" << endl;
    break;
}

Может быть указан блок defaul, выполняющийся если ни одно из значений не подошло

switch (x)
{
case 1:
    cout << "X равен 1" << endl;
    break;
case 2:
    cout << "X равен 2" << endl;
    break;
default:
    cout << "X не равен 1 и 2" << endl;
    break;
}

В блоке case может объявляться переменная без инициализации

switch (x)
{
case 1:
    int a;     // объявление переменной
    a = 1;     // присваивание значения
    break;
case 2:
    a = 2;     // переменная видна, если она объявлена в блоке выше
    break;
default:
    break;
}

Если требуется объявить и инициализировать переменные внутри блока case, то можно использовать вложенный блок кода

switch (x)
{
case 1:
{
    int a = 1;   // объявление и инициализация переменной
    break;
}
case 2:
    int a;       // переменная, объявленная во вложенном блоке выше, здесь не видна
    a = 2;
    break;
default:
    break;
}