Spec-Zone.ru › C

Цикл for

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

Используется как сокращенная форма цикла 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("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 — это необязательный список атрибутов, применённых к оператору for.

(с C23)

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

for

Примечания

Оператор выражения, используемый в качестве 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API