Namespaces
Variants

while loop

From cppreference.net

Выполняет statement повторно, до тех пор, пока значение expression не станет равным нулю. Проверка происходит перед каждой итерацией.

Содержание

Синтаксис

attr-spec-seq (необязательно) while ( expression ) statement
expression - любое выражение скалярного типа. Это выражение вычисляется перед каждой итерацией, и если оно равно нулю, цикл завершается.
statement - любой оператор , обычно составной оператор, который служит телом цикла
attr-spec-seq - (C23) опциональный список атрибутов , применяемых к оператору цикла

Объяснение

Оператор while вызывает повторное выполнение statement (также называемого телом цикла ) до тех пор, пока expression (также называемое управляющим выражением ) не станет равным нулю. Повторение происходит независимо от того, выполняется ли тело цикла обычным способом или с помощью goto внутрь statement .

Вычисление expression происходит перед каждым выполнением statement (если только не было перехода через goto). Если управляющее выражение должно вычисляться после тела цикла, можно использовать цикл do-while .

Если выполнение цикла необходимо прервать в определенный момент, break statement может быть использован в качестве завершающей инструкции.

Если выполнение цикла необходимо продолжить в конце тела цикла, оператор continue может быть использован в качестве сокращения.

Программа с бесконечным циклом имеет неопределённое поведение, если цикл не имеет наблюдаемого поведения (ввод-вывод, доступ к volatile, атомарные или синхронизационные операции) ни в одной части своего statement или expression . Это позволяет компиляторам оптимизировать все ненаблюдаемые циклы без доказательства их завершения. Единственными исключениями являются циклы, где expression является константным выражением; while ( true ) всегда является бесконечным циклом.

Как и все другие операторы выбора и итерации, оператор while устанавливает область видимости блока : любой идентификатор, введенный в выражении , выходит из области видимости после оператора .

(since C99)

Примечания

Логические и указательные выражения часто используются в качестве управляющих выражений циклов. Логическое значение false и нулевое значение указателя любого типа сравниваются с нулём.

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

while

Пример

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { SIZE = 8 };
int main(void)
{
    // тривиальный пример
    int array[SIZE], n = 0;
    while(n < SIZE) array[n++] = rand() % 2;
    puts("Array filled!");
    n = 0;
    while(n < SIZE) printf("%d ", array[n++]);
    printf("\n");
    // классическая реализация strcpy()
    // (копирует нуль-терминированную строку из src в dst)
    char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src;
    while((*p++ = *q++)) // двойные скобки (которые не строго необходимы)
                         // используются для подавления предупреждений, гарантируя, что это
                         // присваивание (в отличие от сравнения) по намерению,
                         // чей результат используется как логическое значение
        ; // пустой оператор
    puts(dst);
}

Вывод:

Array filled!
1 0 1 1 1 1 0 0 
Hello, world

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.8.5.1 Оператор while (стр: 109)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.8.5.1 Оператор while (стр. 151)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.8.5.1 Оператор while (стр: 136)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.6.5.1 Оператор while

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

Документация C++ для while цикла