for loop
Выполняет цикл.
Используется как более короткий эквивалент цикла while .
Содержание |
Синтаксис
attr-spec-seq
(начиная с C23)
(опционально)
for
(
init-clause
;
cond-expression
;
iteration-expression
)
loop-statement
|
|||||||||
Объяснение
Ведёт себя следующим образом:
- init-clause может быть выражением или объявлением (начиная с C99) .
-
- init-clause , который является выражением, вычисляется один раз перед первым вычислением cond-expression , и его результат отбрасывается.
|
(начиная с C99) |
- cond-expression вычисляется перед телом цикла. Если результат выражения равен нулю, выполнение оператора цикла немедленно прекращается.
- iteration-expression вычисляется после тела цикла, и его результат отбрасывается. После вычисления iteration-expression управление передается на cond-expression .
init-clause , cond-expression и iteration-expression являются необязательными. Если cond-expression опущен, он заменяется ненулевой целочисленной константой, что делает цикл бесконечным:
for(;;) { printf("бесконечный цикл!"); }
loop-statement не является опциональным, но может быть пустым оператором:
for(int n = 0; n < 10; ++n, printf("%d\n", n)) ; // пустой оператор
Если выполнение цикла необходимо прервать в некоторой точке, в любом месте loop-statement может быть использован break statement .
Оператор continue , используемый в любом месте внутри loop-statement , передает управление на iteration-expression .
Программа с бесконечным циклом имеет неопределённое поведение, если цикл не имеет наблюдаемого поведения (ввод-вывод, доступ к volatile, атомарные или синхронизационные операции) ни в одной части своего cond-expression , iteration-expression или loop-statement . Это позволяет компиляторам удалять все ненаблюдаемые циклы без доказательства их завершения. Единственными исключениями являются циклы, где cond-expression опущен или является константным выражением; for ( ;; ) всегда является бесконечным циклом.
|
Как и все другие операторы выбора и итерации, оператор for устанавливает область видимости блока : любой идентификатор, объявленный в init-clause , cond-expression , или iteration-expression , выходит из области видимости после loop-statement . |
(since C99) |
|
attr-spec-seq
— это необязательный список
атрибутов
, применяемых к оператору
|
(since C23) |
Ключевые слова
Примечания
Выражение, используемое в качестве loop-statement , устанавливает собственную область видимости блока, отличную от области видимости init-clause , в отличие от C++:
for (int i = 0; ; ) { long i = 1; // корректно для C, некорректно для C++ // ... }
Можно войти в тело цикла с помощью goto . При входе в цикл таким способом, init-clause и cond-expression не выполняются. (Если управление затем достигает конца тела цикла, может произойти повторение, включая выполнение cond-expression .)
Пример
Возможный вывод:
Array filled! 1 0 1 1 1 1 0 0
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 6.8.5.3 Оператор for (стр. 110)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 6.8.5.3 Оператор for (стр. 151)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 6.8.5.3 Оператор for (стр: 136)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 3.6.5.3 Оператор for
Смотрите также
|
Документация C++
для
for
loop
|