C Language
Saltar declaraciones
Buscar..
Sintaxis
- devuelve val; / * Vuelve de la función actual. val puede ser un valor de cualquier tipo que se convierte al tipo de retorno de la función. * /
- regreso; / * Regresa de la función void actual. * /
- descanso; / * Salta incondicionalmente más allá del final ("rompe") de una instrucción de iteración (bucle) o de la instrucción de conmutación más interna. * /
- continuar; / * Salta incondicionalmente al principio de una instrucción de iteración (bucle). * /
- goto LBL; / * Salta para etiquetar LBL. * /
- LBL: declaración / * cualquier declaración en la misma función. * /
Observaciones
Estos son los saltos que se integran en C mediante palabras clave.
C también tiene otra construcción de salto , salto de longitud , que se especifica con un tipo de datos, jmp_buf
y llamadas a la biblioteca de C, setjmp
y longjmp
.
Ver también
Usando goto para saltar fuera de los bucles anidados
Saltar fuera de los bucles anidados normalmente requeriría el uso de una variable booleana con una comprobación de esta variable en los bucles. Suponiendo que estamos iterando sobre i
y j
, podría verse así
size_t i,j;
for (i = 0; i < myValue && !breakout_condition; ++i) {
for (j = 0; j < mySecondValue && !breakout_condition; ++j) {
... /* Do something, maybe modifying breakout_condition */
/* When breakout_condition == true the loops end */
}
}
Pero el lenguaje C ofrece la cláusula goto
, que puede ser útil en este caso. Al usarlo con una etiqueta declarada después de los bucles, podemos romper fácilmente los bucles.
size_t i,j;
for (i = 0; i < myValue; ++i) {
for (j = 0; j < mySecondValue; ++j) {
...
if(breakout_condition)
goto final;
}
}
final:
Sin embargo, a menudo, cuando surge esta necesidad, una return
podría ser mejor utilizada en su lugar. Este constructo también se considera "no estructurado" en la teoría de la programación estructural.
Otra situación en la que goto
podría ser útil es para saltar a un manejador de errores:
ptr = malloc(N * x);
if(!ptr)
goto out_of_memory;
/* normal processing */
free(ptr);
return SUCCESS;
out_of_memory:
free(ptr); /* harmless, and necessary if we have further errors */
return FAILURE;
El uso de goto
mantiene el flujo de errores separado del flujo de control del programa normal. Sin embargo, también se considera "no estructurado" en el sentido técnico.
Usando el retorno
Devolviendo un valor
Un caso comúnmente usado: regresar de main()
#include <stdlib.h> /* for EXIT_xxx macros */
int main(int argc, char ** argv)
{
if (2 < argc)
{
return EXIT_FAILURE; /* The code expects one argument:
leave immediately skipping the rest of the function's code */
}
/* Do stuff. */
return EXIT_SUCCESS;
}
Notas adicionales:
Para una función que tenga un tipo de retorno como
void
(sin incluir los tiposvoid *
o relacionados), la declaración dereturn
no debe tener ninguna expresión asociada; es decir, la única declaración de devolución permitida sería lareturn;
.Para una función que tiene un tipo de retorno no
void
, la declaración dereturn
no aparecerá sin una expresión.Para
main()
(y solo paramain()
), no se requiere una declaración dereturn
explícita (en C99 o posterior). Si la ejecución alcanza la terminación}
, se devuelve un valor implícito de0
. Algunas personas piensan que omitir estereturn
es una mala práctica; otros sugieren activamente omitirlo.
Devolviendo nada
Volviendo de una función de void
void log(const char * message_to_log)
{
if (NULL == message_to_log)
{
return; /* Nothing to log, go home NOW, skip the logging. */
}
fprintf(stderr, "%s:%d %s\n", __FILE__, _LINE__, message_to_log);
return; /* Optional, as this function does not return a value. */
}
Usando break y continue
Inmediatamente continue
leyendo en una entrada no válida o break
en la solicitud del usuario o al final del archivo:
#include <stdlib.h> /* for EXIT_xxx macros */
#include <stdio.h> /* for printf() and getchar() */
#include <ctype.h> /* for isdigit() */
void flush_input_stream(FILE * fp);
int main(void)
{
int sum = 0;
printf("Enter digits to be summed up or 0 to exit:\n");
do
{
int c = getchar();
if (EOF == c)
{
printf("Read 'end-of-file', exiting!\n");
break;
}
if ('\n' != c)
{
flush_input_stream(stdin);
}
if (!isdigit(c))
{
printf("%c is not a digit! Start over!\n", c);
continue;
}
if ('0' == c)
{
printf("Exit requested.\n");
break;
}
sum += c - '0';
printf("The current sum is %d.\n", sum);
} while (1);
return EXIT_SUCCESS;
}
void flush_input_stream(FILE * fp)
{
size_t i = 0;
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF) /* Pull all until and including the next new-line. */
{
++i;
}
if (0 != i)
{
fprintf(stderr, "Flushed %zu characters from input.\n", i);
}
}