C Language
Hoppa uttalanden
Sök…
Syntax
- returval; / * Återgår från den aktuella funktionen. val kan vara ett värde av vilken typ som helst som konverteras till funktionens returtyp. * /
- lämna tillbaka; / * Återgår från den aktuella tomrumsfunktionen. * /
- ha sönder; / * Hopplöst hoppar bortom slutet ("bryter ut") av ett Iteration-uttalande (slinga) eller ut ur den inre brytaren. * /
- Fortsätta; / * Hopplöst hoppar till början av en Iteration Statement (loop). * /
- goto LBL; / * Hoppar till etiketten LBL. * /
- LBL: uttalande / * varje uttalande i samma funktion. * /
Anmärkningar
Det här är hopp som är integrerade i C med hjälp av nyckelord.
C har också ett annat hoppkonstruktion, längdhopp , som anges med en datatyp, jmp_buf och C-biblioteksamtal, setjmp och longjmp .
Se även
Med hjälp av goto för att hoppa ur kapslade öglor
Hoppning från kapslade slingor kräver vanligtvis användning av en boolesisk variabel med en kontroll för denna variabel i slingorna. Antar att vi itererar över i och j , det kan se ut så här
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 */
}
}
Men C-språket erbjuder goto klausulen, som kan vara användbar i det här fallet. Genom att använda den med en etikett som deklareras efter slingorna, kan vi enkelt bryta ur slingorna.
size_t i,j;
for (i = 0; i < myValue; ++i) {
for (j = 0; j < mySecondValue; ++j) {
...
if(breakout_condition)
goto final;
}
}
final:
Men ofta när detta behov kommer upp skulle en return kunna användas bättre istället. Denna konstruktion betraktas också som "ostrukturerad" i strukturell programmeringsteori.
En annan situation där goto kan vara användbart är att hoppa till en felhanterare:
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;
Användning av goto håller felflödet separat från det normala programstyrflödet. Det anses emellertid också "ostrukturerad" i teknisk mening.
Med retur
Återvända ett värde
Ett vanligt förekommande fall: tillbaka från 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;
}
Ytterligare anmärkningar:
För en funktion som har en returtyp som
void(exklusivevoid *eller liknande typer), denreturnbör uttalande inte ha någon tillhörande uttryck; dvs det enda tillåtna returrättet skulle varareturn;.För en funktion som har en icke
voidreturtyp denreturnskall uttalandet inte visas utan ett uttryck.För
main()(och endast förmain()), en uttryckligreturnuttalande inte krävs (i C99 eller senare). Om exekveringen når avslutningen}returneras ett implicit värde på0. Vissa tycker att det är dåligt att utelämna dennareturn; andra föreslår aktivt att lämna det.
Återvända ingenting
Återgå från en void funktion
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. */
}
Använd paus och fortsätt
Fortsätt genast continue läsa om ogiltig inmatning eller break på användarbegäran eller filens slut:
#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);
}
}