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

Ejecuta condicionalmente una sentencia de forma repetida.

Contenidos

Sintaxis

attr  (opcional) while ( condición ) sentencia
attr - (since C++11) cualquier número de atributos
condition - una condición
statement - una sentencia (normalmente una sentencia compuesta)

Condición

Una condición puede ser una expresión o una declaración simple .

  • Si puede resolverse sintácticamente como una declaración de structured binding , se interpreta como una declaración de structured binding.
(since C++26)
  • Si puede resolverse sintácticamente como una expresión, se trata como una expresión. De lo contrario, se trata como una declaración que no es una declaración de enlace estructurado (since C++26) .

Cuando el control alcanza la condición, la condición producirá un valor, que se utiliza para determinar si statement será ejecutado.

Expresión

Si condition es una expresión, el valor que produce es el valor de la expresión convertido contextualmente a bool . Si esa conversión es incorrecta, el programa está mal formado.

Declaración

Si condition es una declaración simple, el valor que produce es el valor de la variable de decisión (ver abajo) convertido contextualmente a bool . Si esa conversión es incorrecta, el programa está mal formado.

Declaración de enlace no estructurado

La declaración tiene las siguientes restricciones:

  • Se ajusta sintácticamente a la siguiente forma:
  • type-specifier-seq declarator = assignment-expression
(hasta C++11)
  • attribute-specifier-seq (opcional) decl-specifier-seq declarator brace-or-equal-initializer
(desde C++11)

La variable de decisión de la declaración es la variable declarada.

Declaración de enlace estructurado

La declaración tiene las siguientes restricciones:

La variable de decisión de la declaración es la variable inventada e introducida por la declaración .

(desde C++26)

Explicación

Una while es equivalente a

/* label */ :

{

if ( condición )
{
sentencia
goto /* label */ ;
}

}

Si condición es una declaración, la variable que declara se destruye y se crea con cada iteración del bucle.

Si el bucle necesita ser terminado dentro de statement , una break statement puede ser usada como sentencia de terminación.

Si la iteración actual necesita ser terminada dentro de statement , se puede usar una continue statement como atajo.

Notas

Independientemente de si statement es una sentencia compuesta, siempre introduce un block scope . Las variables declaradas en él solo son visibles en el cuerpo del bucle, en otras palabras,

while (--x >= 0)
    int i;
// i sale del ámbito

es lo mismo que

while (--x >= 0)
{
    int i;
} // i sale del ámbito

Como parte de la garantía de progreso de C++, el comportamiento es undefined si un bucle que no es un trivial infinite loop (since C++26) sin observable behavior no termina. Los compiladores pueden eliminar dichos bucles.

Palabras clave

while

Ejemplo

#include <iostream>
int main()
{
    // bucle while con una sola sentencia
    int i = 0;
    while (i < 10)
         i++;
    std::cout << i << '\n';
    // bucle while con una sentencia compuesta
    int j = 2;
    while (j < 9)
    {
        std::cout << j << ' ';
        j += 2;
    }
    std::cout << '\n';
    // bucle while con una condición de declaración
    char cstr[] = "Hello";
    int k = 0;
    while (char c = cstr[k++])
        std::cout << c;
    std::cout << '\n';
}

Salida:

10
2 4 6 8
Hello

Véase también