Цикл for
Выполняет оператор-инициализации, затем выполняет оператор и выражение-итерации повторно, пока значение условия не станет ложным. Проверка проводится перед каждой итерацией.
Содержание |
[править] Синтаксис
формальный синтаксис: | |||||||||
атрибуты (необязательно) for ( оператор-инициализации условие (необязательно) ; выражение-итерации (необязательно) ) оператор
|
|||||||||
неформальный синтаксис: | |||||||||
атрибуты (необязательно) for ( объявление-или-выражение (необязательно) ; объявление-или-выражение (необязательно) ; выражение (необязательно) ) оператор
|
|||||||||
атрибуты | — | (начиная с C++11) любое количество атрибутов | ||
оператор-инициализации | — | одно из следующего
| ||
условие | — | одно из
| ||
выражение-итерации | — | любое выражение, которое выполняется после каждой итерации цикла и перед переоценкой условия. Как правило, это выражение, которое увеличивает счётчик циклов | ||
оператор | — | любой оператор, обычно составной оператор, который является телом цикла |
[править] Объяснение
Приведенный выше синтаксис создаёт код, эквивалентный следующему:
{
|
|||||||||
Кроме этого
Если выполнение цикла необходимо прервать в какой-то момент, в качестве завершающего оператора можно использовать оператор 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
|