Namespaces
Variants

while loop

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

Содержание

Синтаксис

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

Условие

Условием может быть либо condition , либо expression , либо simple declaration .

  • Если синтаксически возможно разрешить как structured binding объявление, оно интерпретируется как объявление structured binding.
(since 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)

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

Декларация структурированной привязки

Декларация имеет следующие ограничения:

Переменной решения декларации является введённая переменная e введённая декларацией .

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

Объяснение

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

/* метка */ :

{

if ( условие )
{
оператор
goto /* метка */ ;
}

}

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

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

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

Примечания

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

while (--x >= 0)
    int i;
// i выходит из области видимости

то же самое, что

while (--x >= 0)
{
    int i;
} // i выходит из области видимости

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

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

while

Пример

#include <iostream>
int main()
{
    // цикл while с одним оператором
    int i = 0;
    while (i < 10)
         i++;
    std::cout << i << '\n';
    // цикл while с составным оператором
    int j = 2;
    while (j < 9)
    {
        std::cout << j << ' ';
        j += 2;
    }
    std::cout << '\n';
    // цикл while с условием-объявлением
    char cstr[] = "Hello";
    int k = 0;
    while (char c = cstr[k++])
        std::cout << c;
    std::cout << '\n';
}

Вывод:

10
2 4 6 8
Hello

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

C documentation для while