Namespaces
Variants

Statements

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

Sentencias son fragmentos del programa C++ que se ejecutan en secuencia. El cuerpo de cualquier función es una secuencia de sentencias. Por ejemplo:

int main()
{
    int n = 1;                        // declaración de sentencia
    n = n + 1;                        // sentencia de expresión
    std::cout << "n = " << n << '\n'; // sentencia de expresión
    return 0;                         // sentencia de retorno
}

C++ incluye los siguientes tipos de sentencias:

(desde C++26)
(TM TS)

Contenidos

Sentencias etiquetadas

Una sentencia etiquetada etiqueta una sentencia para fines de control de flujo.

sentencia de etiqueta
label - la etiqueta aplicada a la sentencia (definida abajo)
statement - la sentencia a la que se aplica la etiqueta, puede ser una sentencia etiquetada en sí misma, permitiendo múltiples etiquetas

Etiquetas

label se define como

attr  (opcional) identifier : (1)
attr  (opcional) case constexpr : (2)
attr  (opcional) default: (3)
1) destino para goto ;
2) case etiqueta en una declaración switch ;
3) default etiqueta en una switch sentencia.

Una secuencia de atributos attr puede aparecer justo al principio de la etiqueta (en cuyo caso se aplica a la etiqueta), o justo antes de cualquier sentencia en sí, en cuyo caso se aplica a la sentencia completa.

(since C++11)

Una etiqueta con un identificador declarado dentro de una función coincide con todas las sentencias goto con el mismo identificador en esa función, en todos los bloques anidados, antes y después de su propia declaración.

Dos etiquetas en una función no deben tener el mismo identificador.

Además de poder añadirse a una sentencia, las etiquetas también pueden utilizarse en cualquier parte de sentencias compuestas .

(since C++23)

Las etiquetas no se encuentran mediante unqualified lookup : una etiqueta puede tener el mismo nombre que cualquier otra entidad en el programa.

void f()
{
    {
        goto label; // label en alcance aunque declarado después
        label:      // label puede aparecer al final de un bloque independiente desde C++23
    }
    goto label; // label ignora el alcance de bloque
}
void g()
{
    goto label; // error: label no está en alcance en g()
}

Declaraciones limitadas por flujo de control

Las siguientes declaraciones son declaraciones de flujo de control limitado :

  • La compound-statement de un bloque try .
  • La compound-statement de un handler .
(desde C++17)
(desde C++23)

Para cada sentencia limitada por flujo de control S :

  • Todas las etiquetas de destino goto declaradas en S solo pueden ser referenciadas por sentencias en S .
  • Cada etiqueta case o default que aparece dentro de S solo puede estar asociada con una switch statement dentro de S .

Sentencias de expresión

Una sentencia de expresión es una expresión seguida de un punto y coma.

attr  (opcional) expression  (opcional) ;
attr - (since C++11) secuencia opcional de cualquier número de atributos
expression - una expresión

La mayoría de las declaraciones en un programa típico de C++ son declaraciones de expresión, como asignaciones o llamadas a funciones.

Una sentencia de expresión sin expresión se denomina sentencia nula . Se utiliza frecuentemente para proporcionar un cuerpo vacío a un bucle for o while . También puede utilizarse para llevar una etiqueta al final de una sentencia compuesta. (hasta C++23)

Sentencias compuestas

Una sentencia compuesta o bloque agrupa una secuencia de sentencias en una única sentencia.

attr  (opcional) { statement...  (opcional) label...  (opcional) (desde C++23) }

Cuando se espera una sola instrucción, pero se necesitan ejecutar múltiples instrucciones en secuencia (por ejemplo, en una if o en un bucle), se puede utilizar una instrucción compuesta:

if (x > 5)          // inicio de la sentencia if
{                   // inicio del bloque
    int n = 1;      // sentencia de declaración
    std::cout << n; // sentencia de expresión
}                   // fin del bloque, fin de la sentencia if

Cada sentencia compuesta introduce su propio ámbito de bloque scope ; las variables declaradas dentro de un bloque se destruyen en la llave de cierre en orden inverso:

int main()
{ // inicio del bloque externo
    {                                // inicio del bloque interno
        std::ofstream f("test.txt"); // declaración
        f << "abc\n";                // expresión
    }                                // fin del bloque interno, f se vacía y cierra
    std::ifstream f("test.txt"); // declaración
    std::string str;             // declaración
    f >> str;                    // expresión
} // fin del bloque externo, str se destruye, f se cierra

Una etiqueta al final de una sentencia compuesta se trata como si estuviera seguida por una sentencia nula.

(since C++23)

Sentencias de selección

Una sentencia de selección elige entre uno de varios flujos de control.

attr  (opcional) if constexpr (opcional) ( init-statement  (opcional) condition ) statement (1)
attr  (opcional) if constexpr (opcional) ( init-statement  (opcional) condition ) statement
else statement
(2)
attr  (opcional) switch ( init-statement  (opcional) condition ) statement (3)
attr  (opcional) if ! (opcional) consteval compound-statement (4) (desde C++23)
attr  (opcional) if ! (opcional) consteval compound-statement else statement (5) (desde C++23)
1) if sentencia;
2) if sentencia con una cláusula else;
3) switch sentencia;
5) sentencia consteval if con una cláusula else.

Sentencias de iteración

Una sentencia de iteración ejecuta repetidamente algún código.

attr  (opcional) while ( condition ) statement (1)
attr  (opcional) do statement while ( expression ) ; (2)
attr  (opcional) for ( init-statement condition  (opcional) ; expression  (opcional) ) statement (3)
attr  (opcional) for
( init-statement  (opcional) (desde C++20) for-range-decl : for-range-init ) statement
(4) (desde C++11)
1) while bucle;
2) do-while bucle;
3) for bucle;
4) range for bucle.

Sentencias de salto

Una sentencia de salto transfiere incondicionalmente el flujo de control.

attr  (opcional) break; (1)
attr  (opcional) continue; (2)
attr  (opcional) return expresión  (opcional) ; (3)
attr  (opcional) return lista-de-inicialización-entre-llaves ; (4) (desde C++11)
attr  (opcional) goto identificador ; (5)
1) break sentencia;
2) continue sentencia;
3) return sentencia con una expresión opcional;
4) return sentencia usando list initialization ;
5) goto sentencia.

Nota: para todas las sentencias de salto, la transferencia fuera de un bucle, fuera de un bloque, o de regreso más allá de una variable inicializada con duración de almacenamiento automático implica la destrucción de objetos con duración de almacenamiento automático que están en el ámbito en el punto desde el cual se transfiere pero no en el punto al cual se transfiere. Si múltiples objetos fueron inicializados, el orden de destrucción es el opuesto al orden de inicialización.

Sentencias de aserción

Una aserción de contrato.

contract_assert attr  (opcional) ( predicate ) ;
1) contract_assert sentencia.
(desde C++26)

Declaraciones de declaración

Una declaración introduce uno o más identificadores en un bloque.

block-declaration (1)
1) Consulte Declarations y Initialization para más detalles.

try bloques

Un try bloque captura excepciones lanzadas al ejecutar otras sentencias.

attr  (opcional) try compound-statement handler-sequence (1)
1) Consulte el try block para más detalles.


Bloques atómicos y sincronizados

Un bloque atómico y sincronizado proporciona memoria transaccional .

synchronized compound-statement (1) (TM TS)
atomic_noexcept compound-statement (2) (TM TS)
atomic_cancel compound-statement (3) (TM TS)
atomic_commit compound-statement (4) (TM TS)
1) bloque sincronizado , ejecutado en un único orden total con todos los bloques sincronizados;
2) bloque atómico que aborta en excepciones;
3) bloque atómico que revierte en excepciones;
4) bloque atómico que confirma en excepciones.
(TM TS)

Subdeclaraciones

Una subdeclaración de una declaración es una de las siguientes:

Una sentencia S1 engloba a una sentencia S2 si se satisface alguna de las siguientes condiciones:

  • S2 es una subdeclaración de S1
  • S1 es una declaración de selección o declaración de iteración, y S2 es la init-statement de S1 .
  • S1 es un try block , y S2 es ya sea su compound-statement o el compound-statement de cualquier handler en su handler-seq .
  • S1 engloba una declaración S3 y S3 engloba S2 .

Una declaración S1 está encerrada por una declaración S2 si S2 encierra S1 .

Véase también

Documentación de C para Statements