for - оператор цикла C++

for - оператор цикла выполняющийся до тех пор пока условие не станет ложным. Применяют при необходимости выполнить блок кода более одного раза.
for(init_expression; cond_expression; loop_expression){
    code;
}
next_code;
Где:
init_expression - выражение инициализации, выполняется один раз самым первым при выполнении цикла for. Обычно инициализируется переменная индекса (счетчика) количества выполнений цикла for. Может содержать несколько инструкций, разделенных запятой.
cond_expression - выражение условия, выполняется на каждом цикле оператора for, включая первый. Обычно сравнивает переменную индекса (счетчика) с целочисленным значением. Если условие выполняется (cond_expression == true), то выполняется блок кода code а затем loop_expression. Может содержать только одну инструкцию.
loop_expression - выражение цикла, выполняется после cond_expression, в случае если cond_expression истинно (true). Обычно увеличивает или уменьшает переменную индекса (счетчика). Может содержать несколько инструкций, разделенных запятой.
next_code - код выполняющийся после завершения циклаfor и он не будет выполнен только в случае бесконечного цикла for/

- После init_expression и cond_expression ставится точка с запятой, после loop_expression никаких разделителей не ставится (кроме закрывающейся скобки оператора for).

- Если переменные объявляются в init_expression, то они доступны в cond_expression, loop_expression и code, за пределами цикла for они недоступны.

- Выражение в cond_expression должно быть достижимым, иначе произойдет бесконечный цикл (повторения) выполнения блока кода code, контроль за этим лежит на программисте.

- Обычно цикл for применяют когда количество выполнения блока кода code известно, если же оно зависит от каких-то внешних условий, возможно, лучше будет применить оператор цикла while или do while.

Первое условие в цикле for выполняется в любом случае. Программа ниже показывает это, происходит инкрементирование (увеличение на единицу) переменной a


#include <iostream> // cout
#include <vector>   // vector

int main(){
    int a = 0;
    for(a++; a > 10; a--); // Втророе условие (и соответственно третье) в цикле for никогда не выполнится
    std::cout << a; //1 произошло инкрементирование переменной a в первом условии
}

#include <iostream> // std::cout
int main(){
    for(int i = 0; i < 10; i++){    // Перебираем числа от нуля до девяти включительно
        std::cout << i << " ";      //0 1 2 3 4 5 6 7 8 9
    }
}

В cond_expression может быть выражение не i < 10;, а i !=10; результат будет одинаковый, более того есть рекомендации именно так и поступать, поскольку при цикле for c итераторами сравнивать можно только на равенство.


#include <iostream> // std::cout
int main(){
    for(int i = 0; i != 10; i++){    // Перебираем числа от нуля до девяти включительно
        std::cout << i << " ";      //0 1 2 3 4 5 6 7 8 9
    }
}

В loop_expression может быть выражение типа i++ или ++i, результат будет одинаковый. Для перебора значений в обратном направлении нужно использовать цикл for с оператором декремента --i или i--.


#include <iostream> // std::cout
int main(){
    for(int i = 9; i >= 0; --i){    // Перебираем числа от девяти до нуля включительно
        std::cout << i << " ";      //9 8 7 6 5 4 3 2 1 0
    }
}

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


#include <iostream> // std::cout
int main(){
    for (int i = 5, j = 10; i + j < 20; i++, j++){  // В выражении инициализации и цикла две переменных разделенных запятыми
        std::cout << i + j << " ";                  //15 17 19
    }
}

Цикл for(;;) без аргументов является бесконечным циклом, эквивалентным while(1)

Цикл for может быть прекращен операторам return, goto или break

Возможен переход к следующей итерации цикла for оператором continue


#include <iostream> // std::cout
int main(){
    int count = 0;
    for ( ; ; ){  // В выражении инициализации и цикла две переменных разделенных запятыми
        count++; // Инкрементируем счетчик
        if(count > 50){ // Если count больше пятидесяти
            std::cout << "break";
            break;  // Прекращаем выполнение ближайшего цикла (for( ; ; ))
        }
        if(count > 5){ // Если count больше пяти
            continue;  // Переходим к следующей итерации цикла
        }
        std::cout << count << " "; //1 2 3 4 5 break
    }
}

for и контейнеры

При использовании контейнеров, и необходимости перебора их записей, можно использовать сокращенную версию оператора for(auto var : container){}, где container - это контейнер :), а переменная var представляет запись в контейнере;


#include <iostream> // cout
#include <vector>   // vector

int main(){
    std::vector<int> vec{1, 3, 5, 7, 9};    // Вектор vec со значениями 1, 3, 5, 7, 9
    for(auto i : vec){   // Перебираем все значения вектора
        std::cout << i << " "; //1 3 5 7 9  
    }
}

Также можно перебирать записи контейнера через итераторы (указатели на записи), где begin() возвращает итератор на первый элемент контейнера, а end() на место за последним элементом контейнера.


#include <iostream> // cout
#include <vector>   // vector

int main(){
    std::vector<int> vec{1, 3, 5, 7, 9};    // Вектор vec со значениями 1, 3, 5, 7, 9
    for(auto it = vec.begin(); it != vec.end(); it++){   // Перебираем все значения вектора через итераторы
        std::cout << *it << " "; //1 3 5 7 9
    }
}

Часто необходимо перебрать элементы контейнера в обратном порядке. Для этого вместо итераторов возвращаемых begin() и end() используют rbegin() и rend().


#include <iostream> // cout
#include <vector>   // vector

int main(){
    std::vector<int> vec{1, 3, 5, 7, 9};    // Вектор vec со значениями 1, 3, 5, 7, 9
    for(auto it = vec.rbegin(); it != vec.rend(); it++){   // Перебираем все значения вектора через итераторы
        std::cout << *it << " "; //9 7 5 3 1
    }
}
2023-11-19



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

continue оператор С++ прерывающий текущую итерацию цикла do, while или for
default C++ указание ветки по умолчанию в операторе switch или создания конструктора по умолчанию в классе
do C++ оператор цикла
else оператор ветвления С++
for - оператор цикла C++ выполняющийся до тех пор пока условие не станет ложным
goto C++ оператор безусловного перехода
if оператор условного выполнения кода С++
switch C++ оператор ветвления
while C++ оператор цикла