Цикл for
Выполняет оператор-инициализации, затем выполняет оператор и выражение-итерации повторно, пока значение условия не станет ложным. Проверка проводится перед каждой итерацией.
Синтаксис
| формальный синтаксис: | |||||||||
атрибуты (необязательно) for ( оператор-инициализации условие (необязательно) ; выражение-итерации (необязательно) ) оператор
|
|||||||||
| неформальный синтаксис: | |||||||||
атрибуты (необязательно) for ( объявление-или-выражение (необязательно) ; объявление-или-выражение (необязательно) ; выражение (необязательно) ) оператор
|
|||||||||
| атрибуты | — | (начиная с C++11) любое количество атрибутов | ||
| оператор-инициализации | — | одно из следующего
| ||
| условие | — | одно из
| ||
| выражение-итерации | — | любое выражение, которое выполняется после каждой итерации цикла и перед переоценкой условия. Как правило, это выражение, которое увеличивает счётчик циклов | ||
| оператор | — | любой оператор, обычно составной оператор, который является телом цикла |
Объяснение
Приведенный выше синтаксис создаёт код, эквивалентный следующему:
{
|
|||||||||
Кроме этого
while(true)Если выполнение цикла необходимо прервать в какой-то момент, в качестве завершающего оператора можно использовать оператор break.
Если выполнение цикла необходимо продолжить в конце тела цикла, как сокращение можно использовать оператор continue.
Как и в случае с циклом while, если оператор является одиночным оператором (а не составным оператором), область действия переменных, объявленных в нём, ограничена телом цикла, как если бы он был составным оператором.
for (;;)
int n;
// n выходит из области видимости
Ключевые слова
Примечание
Как часть гарантии продвижения вперёд C++, поведение не определено, если цикл, который не имеет наблюдаемого поведения (не выполняет вызовы функций Ввода/Вывода, не обращается к volatile объектам или не выполняет атомарные операции или операции синхронизации), не завершается. Компиляторам разрешено удалять такие циклы.
В то время как в C имена, объявленные в области действия оператора-инициализации и условия, могут быть затенены в области действия оператора, в C++ это запрещено:
for (int i = 0; ; ) {
long i = 1; // допустимо в C, недопустимо в C++
// ...
}
Пример
#include <iostream>
#include <vector>
int main()
{
std::cout << "1) типичный цикл с одним оператором в качестве тела:\n";
for (int i = 0; i < 10; ++i)
std::cout << i << ' ';
std::cout << "\n\n" "2) оператор-инициализации может объявлять несколько имён,\n"
"если они могут использовать одну и ту же\n"
"последовательность-спецификаторов-объявления:\n";
for (int i = 0, *p = &i; i < 9; i += 2)
std::cout << i << ':' << *p << ' ';
std::cout << "\n\n" "3) условие может быть объявлением:\n";
char cstr[] = "Привет";
for (int n = 0; char c = cstr[n]; ++n)
std::cout << c;
std::cout << "\n\n" "4) оператор-инициализации может использовать спецификатор\n"
"автоматического типа:\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) оператор-инициализации может быть выражением:\n";
int n = 0;
for (std::cout << "Начало цикла\n";
std::cout << "Тест цикла\n";
std::cout << "Итерация " << ++n << '\n')
{
if(n > 1)
break;
}
std::cout << "\n" "6) конструкторы и деструкторы объектов, созданных\n"
"в теле цикла, вызываются на каждой итерации:\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};
}
Вывод:
1) типичный цикл с одним оператором в качестве тела:
0 1 2 3 4 5 6 7 8 9
2) оператор-инициализации может объявлять несколько имён,
если они могут использовать одну и ту же
последовательность-спецификаторов-объявления:
0:0 2:2 4:4 6:6 8:8
3) условие может быть объявлением:
Привет
4) оператор-инициализации может использовать спецификатор
автоматического типа:
3 1 4 1 5 9
5) оператор-инициализации может быть выражением:
Начало цикла
Тест цикла
Итерация 1
Тест цикла
Итерация 2
Тест цикла
6) конструкторы и деструкторы объектов, созданных
в теле цикла, вызываются на каждой итерации:
S::S(0, 5); S::~S()
S::S(1, 4); S::~S()
S::S(2, 3); S::~S()
Смотрите также
диапазонный цикл for(C++11)
|
выполняет цикл по диапазону |
Документация C по for
| |