for(init_expression; cond_expression; loop_expression){ code; } next_code;Где:
- После 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(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
}
}