Цикл for в C++: синтаксис, примеры и возможные ошибки

обложка статьи

Здравствуйте, дорогие читатели! Циклы, являются неотъемлемой частью любого языка программирования. Они позволяют нам выполнять огромное количество рутинных операций, которые делать вручную невероятно сложно. В этом и заключается главная “прелесть” циклов.

Существует три вида циклов в C++:

В данной статье речь пойдет о цикле for.

Как работает цикл for?

Цикл for последовательно выполняет одинаковые действия, определенное количество раз. Например, тысячу раз будет выводить сообщение Hello, world!.

Давайте рассмотрим структуру цикла for:

for (<объявление счетчика>; <условие выполнения цикла>; <шаг цикла>) {
    <тело цикла>
}

Теперь давайте поподробнее рассмотрим синтаксис цикла for:

  • <объявление счетчика> - здесь нужно создать переменную (счетчик цикла) и задать ей первоначальное значение. Эта команда выполняется до запуска цикла;
  • <условие выполнения цикла> - оно похоже на условие оператора if. Нам нужно указать логическое выражение, при истинности которого, цикл будет работать;
  • <шаг цикла> - данная инструкция будет выполняться в конце каждой итерации, переводя счетчик цикла на новое значение;
  • <тело цикла> - здесь мы указываем код, который будет выполнятся на каждой итерации цикла.

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

Пример работы цикла for

Следующая программа находит произведение цифр от 1 до N (факториал):

#include <iostream>
#include <stdlib.h>
using namespace std;

int main() {
    int n; // создаем переменную n
    cout << "N = "; // выводим сообщение cin >> n; // считываем значение

    int res = 1; // создаем переменную res
    // в ней мы будем хранить результат работы цикла
    for (int i = 1; i <= n; i++) // цикл for
        res *= i; // умножаем на i полученное ранее значение

    cout << "RES = " << res << endl; // выводим результат работы программы

    return 0;
}

Вот один из возможных результатов работы данной программы:

N = 7
RES = 5040

Process returned 0 (0x0) execution time : 2.723 s
Press any key to continue.

Теперь давайте приступи к разбору кода:

  • Строка 6: мы создаем переменную n. В будущем ее мы будем использовать в условии выполнения цикла.
  • Строка 10: нам нужна переменная в которой будет хранится результат работы цикла. Поэтому мы создаем переменную res.
  • Строка 11: вот мы и добрались до цикла for. Здесь давайте разберемся поподробнее:
    • в качестве счетчика выступает переменная i. Мы сразу ей задаем значение 1 (собственно можно было начать и с двух, поскольку умножение на 1 не имеет смысла);
    • условием выполнения цикла является нестрогое неравенство. Цикл будет выполнятся до тех пор, пока i меньше или равно n;
    • после каждой итерации мы увеличиваем значение счетчика на единицу (операция инкремента). Это равносильно следующей записи: i = i + 1.
  • Строка 14: выводим результат работы программы на экран пользователя.

Данный пример довольно наглядно демонстрирует возможности циклов. Однако давайте рассмотрим еще одну из вариаций цикла for, которая наглядно демонстрирует его гибкость:

int a, b;
for (a = 140, b = 1742; a != b; ) {
    if (a > b)
        a -= b;
    else
        b -= a;
}

cout << a;

Данная программа - это реализация алгоритма нахождения НОД. Давайте не будем разбирать его работу, а просто рассмотрим особенности данного кода:

  • в качестве счетчика можно указывать сразу несколько переменных. Также они не обязательно должны быть объявлены непосредственно в самом блоке;

  • любой из блоков (их 3) может вовсе отсутствовать. Вот хороший пример работы бесконечного цикла:

    for (;;) { <код> }

    Данный код будет выполняться до тех пор, пока пользователь принудительно не завершит работу программы.

Довольно часто вам придется пользоваться лишь одной вариацией цикла for. Однако если вам придется выполнять специфические задачи, то вы сможете подстроить цикл for под свои “хотелки”.

Возможные ошибки

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

Сегфолт

У данной ошибки довольно много причин. Подробнее о ней можете почитать на Википедии. В случае работы с циклами она может возникнуть следующим образом:

for (int i; i < 10; i++) {
    <ваш код>
}

Вы могли заметь, что здесь переменной i не задали значение. Изначально переменная содержит “мусор” (можете вывести такой мусор на экран для того, чтобы понять о чем я говорю). Естественно к мусору прибавлять ничего нельзя - программа вылетит.

Постарайтесь выработать привычку всегда обнулять созданные переменные. Это избавит вас от огромного количества проблем при написании собственных программ.

Некоторые компиляторы обнуляют переменные при их создании. Например, это делает компилятор gcc.

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

Данная ошибка часто возникает из-за неправильного условия или изменение значения счетчика внутри цикла.

Давайте посмотрим на простой пример:

for (int i = 0; i < 10; i++) {
    r += --i;
}

Данный цикл никогда не завершится, поскольку внутри значение i уменьшается на единицу, а после опять увеличивается. Таким образов условие i < 10 всегда будет истинным.

В качестве домашнего задания, напишите программу, которая будет находить сумму чисел от 1 до N. Удачи!

« Цикл while в C++

Оператор ветвления if »

Обсуждение