Цикл for
Выполняет init-statement один раз, затем выполняет statement и iteration-expression многократно, до тех пор, пока значение condition не станет ложным. Проверка происходит перед каждой итерацией.
Синтаксис
| формальный синтаксис: | ||
attr (необязательно) for ( init-statement condition (необязательно) ; iteration-expression (необязательно) ) statement |
||
| неформальный синтаксис: | ||
attr (необязательно) for ( declaration-or-expression (необязательно) ; condition (необязательно) ; expression (необязательно) ) statement |
| attr | - | (с C++11) любое количество атрибутов. | ||
| init-statement | - | один из
;, поэтому его часто неформально описывают как выражение или объявление, за которым следует точка с запятой. |
||
| condition | - | либо
|
||
| iteration-expression | - | любое выражение, которое выполняется после каждой итерации цикла и перед повторной оценкой condition. Обычно это выражение, которое увеличивает счётчик цикла. | ||
| statement | - | любой оператор, обычно составной оператор, который представляет собой тело цикла. |
Объяснение
Вышеуказанный синтаксис генерирует код, эквивалентный:
{
|
За исключением того, что
while (true).
Если выполнение цикла необходимо завершить в какой-то момент, можно использовать оператор break в качестве оператора завершения.
Если выполнение цикла необходимо продолжить в конце тела цикла, можно использовать оператор continue в качестве сокращения.
Как и в случае с циклом while, если statement является единственным оператором (не составным оператором), область видимости переменных, объявленных в нём, ограничена телом цикла так, как если бы это был составной оператор.
for (;;)
int n;
// n goes out of scopeКлючевые слова
Примечания
В соответствии с гарантией прямого продвижения в C++, поведение является неопределённым, если цикл, у которого нет наблюдаемого поведения (не вызывает функции ввода-вывода, не обращается к переменным volatile или не выполняет атомарные или синхронизационные операции), не завершается. Компиляторы могут удалить такие циклы. В то время как в C имена, объявленные в области видимости init-statement и condition, могут быть скрыты в области видимости statement, это запрещено в C++:
for (int i = 0;;)
{
long i = 1; // valid C, invalid C++
// ...
}Пример
#include <iostream>
#include <vector>
int main()
{
std::cout << "1) typical loop with a single statement as the body:\n";
for (int i = 0; i < 10; ++i)
std::cout << i << ' ';
std::cout << "\n\n" "2) init-statement can declare multiple names, as\n"
"long as they can use the same decl-specifier-seq:\n";
for (int i = 0, *p = &i; i < 9; i += 2)
std::cout << i << ':' << *p << ' ';
std::cout << "\n\n" "3) condition may be a declaration:\n";
char cstr[] = "Hello";
for (int n = 0; char c = cstr[n]; ++n)
std::cout << c;
std::cout << "\n\n" "4) init-statement can use the auto type specifier:\n";
std::vector<int> v = {3, 1, 4, 1, 5, 9};
for (auto iter = v.begin(); iter != v.end(); ++iter)
std::cout << *iter << ' ';
std::cout << "\n\n" "5) init-statement can be an expression:\n";
int n = 0;
for (std::cout << "Loop start\n";
std::cout << "Loop test\n";
std::cout << "Iteration " << ++n << '\n')
{
if (n > 1)
break;
}
std::cout << "\n" "6) constructors and destructors of objects created\n"
"in the loop's body are called per each iteration:\n";
struct S
{
S(int x, int y) { std::cout << "S::S(" << x << ", " << y << "); "; }
~S() { std::cout << "S::~S()\n"; }
};
for (int i{0}, j{5}; i < j; ++i, --j)
S s{i, j};
std::cout << "\n" "7) init-statement can use structured bindings:\n";
long arr[]{1, 3, 7};
for (auto [i, j, k] = arr; i + j < k; ++i)
std::cout << i + j << ' ';
std::cout << '\n';
}Вывод:
1) typical loop with a single statement as the body: 0 1 2 3 4 5 6 7 8 9 2) init-statement can declare multiple names, as long as they can use the same decl-specifier-seq: 0:0 2:2 4:4 6:6 8:8 3) condition may be a declaration: Hello 4) init-statement can use the auto type specifier: 3 1 4 1 5 9 5) init-statement can be an expression: Loop start Loop test Iteration 1 Loop test Iteration 2 Loop test 6) constructors and destructors of objects created in the loop's body are called per each iteration: S::S(0, 5); S::~S() S::S(1, 4); S::~S() S::S(2, 3); S::~S() 7) init-statement can use structured bindings: 4 5 6
См. также
цикл range-for(C++11) |
выполняет цикл по диапазону |
C документация для for |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/for