Spec-Zone.ru › C++

while цикл

Условно выполняет оператор повторно.

Синтаксис

attr (необязательно) while ( condition ) statement
attr — (начиная с C++11) любое количество атрибутов
condition — условие
statement — оператор (обычно составной оператор)

Условие

condition может быть либо выражением, либо простым объявлением.

  • Если его можно синтаксически распознать как объявление структурированной привязки, оно интерпретируется как объявление структурированной привязки.
(начиная с C++26)
  • Если его можно синтаксически распознать как выражение, оно рассматривается как выражение. В противном случае оно рассматривается как объявление, не являющееся объявлением структурированной привязки(начиная с C++26).

При передаче управления к условию оно вычисляется и выдаёт значение, которое используется для определения, будет ли выполнен statement.

Выражение

Если condition является выражением, выданное им значение — это значение выражения, контекстно преобразованное в bool. Если такое преобразование некорректно, программа некорректна.

Объявление

Если condition является простым объявлением, выданное им значение — это значение переменной выбора (см. ниже), контекстно преобразованное в bool. Если такое преобразование некорректно, программа некорректна.

Объявление, не являющееся объявлением структурированной привязки

Объявление должно удовлетворять следующим ограничениям:

  • Синтаксически соответствовать следующей форме:
  • type-specifier-seq declarator = assignment-expression
(до C++11)
  • attribute-specifier-seq(необязательно) decl-specifier-seq declarator brace-or-equal-initializer
(начиная с C++11)
  • Декларатор не может задавать функцию или массив.
  • Последовательность спецификаторов типа(до C++11)Последовательность спецификаторов объявления может содержать только спецификаторы типа и constexpr, и она(начиная с C++11) не может определять класс или перечисление.

Переменная выбора в объявлении — это объявленная переменная.

Объявление структурированной привязки

Объявление должно удовлетворять следующим ограничениям:

  • expression в его инициализаторе не может иметь тип массива.
  • Последовательность спецификаторов объявления может содержать только спецификаторы типа и constexpr.

Переменная выбора в объявлении — это фиктивная переменная e вводимая объявлением.

(начиная с C++26)

Пояснение

Оператор while эквивалентен

/* метка */ :

{

if ( condition )
{
statement
goto /* метка */ ;
}

}

Если condition является объявлением, объявленная им переменная уничтожается и создаётся заново на каждой итерации цикла.

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

Если текущую итерацию необходимо завершить внутри statement, для этого можно использовать оператор continue.

Примечания

Независимо от того, является ли statement составным оператором, он всегда вводит блочную область видимости. Объявленные в нём переменные видны только в теле цикла. Иными словами,

while (--x >= 0)
    int i;
// i goes out of scope

эквивалентно

while (--x >= 0)
{
    int i;
} // i goes out of scope

В соответствии с гарантией прогресса C++ поведение является неопределённым, если цикл, не являющийся тривиальным бесконечным циклом(начиная с C++26) без наблюдаемого поведения не завершается. Компиляторам разрешено удалять такие циклы.

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

while

Пример

#include <iostream>

int main()
{
    // while loop with a single statement
    int i = 0;
    while (i < 10)
         i++;
    std::cout << i << '\n';
    
    // while loop with a compound statement
    int j = 2;
    while (j < 9)
    {
        std::cout << j << ' ';
        j += 2;
    }
    std::cout << '\n';
    
    // while loop with a declaration condition
    char cstr[] = "Hello";
    int k = 0;
    while (char c = cstr[k++])
        std::cout << c;
    std::cout << '\n';
}

Вывод:

10
2 4 6 8
Hello

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/while

Spec-Zone.ru

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