Цикл for
Выполняет цикл.
Используется как сокращенная форма цикла 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("endless loop!");
}loop-statement необязательно, но может быть пустым оператором:
for(int n = 0; n < 10; ++n, printf("%d\n", n))
; // null statementЕсли выполнение цикла необходимо прервать в какой-то момент, можно использовать оператор break в любом месте внутри loop-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. | (с C99) |
| attr-spec-seq — это необязательный список атрибутов, применённых к оператору | (с C23) |
Ключевые слова
Примечания
Оператор выражения, используемый в качестве loop-statement, устанавливает свою собственную область видимости блока, отличную от области видимости init-clause, в отличие от C++:
for (int i = 0; ; ) {
long i = 1; // valid C, invalid C++
// ...
}Можно войти в тело цикла с помощью goto. При входе в цикл таким образом, init-clause и cond-expression не выполняются. (Если управление затем достигнет конца тела цикла, повторение может произойти, включая выполнение cond-expression.)
Пример
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
int array[SIZE];
for(size_t i = 0 ; i < SIZE; ++i)
array [i] = rand() % 2;
printf("Array filled!\n");
for (size_t i = 0; i < SIZE; ++i)
printf("%d ", array[i]);
putchar('\n');
}Возможный вывод:
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 цикла |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/for