Namespaces
Variants

for loop

From cppreference.net

Выполняет цикл.

Используется как более короткий эквивалент цикла while .

Содержание

Синтаксис

attr-spec-seq (начиная с C23) (опционально) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement

Объяснение

Ведёт себя следующим образом:

  • init-clause может быть выражением или объявлением (начиная с C99) .
  • init-clause , который является выражением, вычисляется один раз перед первым вычислением cond-expression , и его результат отбрасывается.
  • init-clause , являющийся объявлением, находится в области видимости во всем теле цикла, включая оставшуюся часть init-clause , весь cond-expression , весь iteration-expression и весь loop-statement . Только auto и register спецификаторы класса хранения разрешены для переменных, объявленных в этом объявлении.
(начиная с 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 — это необязательный список атрибутов , применяемых к оператору for .

(since C23)

Ключевые слова

for

Примечания

Выражение, используемое в качестве loop-statement , устанавливает собственную область видимости блока, отличную от области видимости init-clause , в отличие от C++:

for (int i = 0; ; ) {
    long i = 1;   // корректно для C, некорректно для 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

Смотрите также