Namespaces
Variants

Statements

From cppreference.net

Las sentencias son fragmentos del programa en C que se ejecutan en secuencia. El cuerpo de cualquier función es una sentencia compuesta, que, a su vez, es una secuencia de sentencias y declaraciones:

int main(void)
{ // inicio de una sentencia compuesta
    int n = 1; // declaración (no es una sentencia)
    n = n+1; // sentencia de expresión
    printf("n = %d\n", n); // sentencia de expresión
    return 0; // sentencia return
} // fin de la sentencia compuesta, fin del cuerpo de la función


Hay cinco tipos de sentencias:

Una secuencia de especificadores de atributos ( attr-spec-seq ) puede aplicarse a una sentencia sin etiqueta, en cuyo caso (excepto para una sentencia de expresión) los atributos se aplican a la respectiva sentencia.

(since C23)

Contenidos

Etiquetas

Cualquier sentencia puede ser etiquetada , proporcionando un nombre seguido de dos puntos antes de la sentencia misma.

attr-spec-seq (opcional) (desde C23) identifier : (1)
attr-spec-seq (opcional) (desde C23) case constant-expression : (2)
attr-spec-seq (opcional) (desde C23) default : (3)
1) Objetivo para goto .
2) Etiqueta de caso en una switch sentencia.
3) Etiqueta predeterminada en una switch statement.

Cualquier sentencia (pero no una declaración) puede estar precedida por cualquier número de etiquetas , cada una de las cuales declara identifier como un nombre de etiqueta, que debe ser único dentro de la función contenedora (en otras palabras, los nombres de etiqueta tienen ámbito de función ).

La declaración de etiqueta no tiene efecto por sí sola, no altera el flujo de control, ni modifica el comportamiento de la declaración que le sigue de ninguna manera.

Una etiqueta debe ir seguida de una sentencia.

(hasta C23)

Una etiqueta puede aparecer sin su sentencia siguiente. Si una etiqueta aparece sola en un bloque, se comporta como si estuviera seguida de una sentencia nula .

El attr-spec-seq opcional se aplica a la etiqueta.

(desde C23)

Sentencias compuestas

Una sentencia compuesta, o bloque , es una secuencia de sentencias y declaraciones encerrada entre llaves.

{ sentencia | declaración ... (opcional) } (hasta C23)
attr-spec-seq (opcional) { unlabeled-statement | etiqueta | declaración ... (opcional) } (desde C23)

La sentencia compuesta permite que un conjunto de declaraciones y sentencias se agrupen en una unidad que puede utilizarse en cualquier lugar donde se espera una única sentencia (por ejemplo, en una if statement o una sentencia de iteración):

if (expr) // inicio de la sentencia if
{ // inicio del bloque
  int n = 1; // declaración
  printf("%d\n", n); // sentencia de expresión
} // fin del bloque, fin de la sentencia if

Cada sentencia compuesta introduce su propio block scope .

Los inicializadores de las variables con duración de almacenamiento automática declaradas dentro de un bloque y los declaradores de VLA se ejecutan cuando el flujo de control pasa sobre estas declaraciones en orden, como si fueran sentencias:

int main(void)
{ // inicio del bloque
  { // inicio del bloque
       puts("hello"); // sentencia de expresión
       int n = printf("abc\n"); // declaración, imprime "abc", almacena 4 en n
       int a[n*printf("1\n")]; // declaración, imprime "1", asigna 8*sizeof(int)
       printf("%zu\n", sizeof(a)); // sentencia de expresión
  } // fin del bloque, el ámbito de n y a termina
  int n = 7; // n puede reutilizarse
}

Sentencias de expresión

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

expresión (opcional) ; (1)
attr-spec-seq expresión ; (2) (desde C23)

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 o antes de una declaración:

puts("hello"); // declaración de expresión
char *s;
while (*s++ != '\0')
    ; // declaración nula

El opcional attr-spec-seq se aplica a la expresión.

Una attr-spec-seq seguida de ; no forma una sentencia de expresión. Forma una declaración de atributo en su lugar.

(desde C23)

Sentencias de selección

Las sentencias de selección eligen entre una de varias sentencias dependiendo del valor de una expresión.

attr-spec-seq (opcional) (desde C23) if ( expression ) statement (1)
attr-spec-seq (opcional) (desde C23) if ( expression ) statement else statement (2)
attr-spec-seq (opcional) (desde C23) switch ( expression ) statement (3)
1) if sentencia
2) if sentencia con una cláusula else
3) switch sentencia

Sentencias de iteración

Las sentencias de iteración ejecutan repetidamente una sentencia.

attr-spec-seq (opcional) (desde C23) while ( expression ) statement (1)
attr-spec-seq (opcional) (desde C23) do statement while ( expression ) ; (2)
attr-spec-seq (opcional) (desde C23) for ( init-clause ; expression (opcional) ; expression (opcional) ) statement (3)
1) while bucle
2) do-while bucle
3) for bucle

Sentencias de salto

Las sentencias de salto transfieren incondicionalmente el flujo de control.

attr-spec-seq (opcional) (desde C23) break ; (1)
attr-spec-seq (opcional) (desde C23) continue ; (2)
attr-spec-seq (opcional) (desde C23) return expression (opcional) ; (3)
attr-spec-seq (opcional) (desde C23) goto identifier ; (4)
1) break sentencia
2) continue sentencia
3) return sentencia con una expresión opcional
4) goto sentencia

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.8 Declaraciones y bloques (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.8 Declaraciones y bloques (p: 106-112)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.8 Declaraciones y bloques (p: 146-154)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.8 Declaraciones y bloques (p: 131-139)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.6 STATEMENTS

Véase también

Documentación de C++ para Statements