Statements
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) | ||||||||
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
|
(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) | ||||||||
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) | ||||||||
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) | ||||||||
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
|