goto statement
Überträgt die Steuerung bedingungslos an den gewünschten Ort.
Wird verwendet, wenn es anderweitig unmöglich ist, die Kontrolle an die gewünschte Stelle mit konventionellen Konstrukten zu übertragen.
Inhaltsverzeichnis |
Syntax
attr-spec-seq
(optional)
goto
label
;
|
|||||||||
| label | - |
Ziel-
Label
für die
goto
-Anweisung
|
| attr-spec-seq | - |
(C23)
optionale Liste von
Attributen
, angewendet auf die
goto
-Anweisung
|
Erklärung
Die
goto
-Anweisung bewirkt einen unbedingten Sprung (Kontrolltransfer) zu der Anweisung, die durch die benannte
label
gekennzeichnet ist (die in derselben Funktion wie die goto-Anweisung erscheinen muss)
, außer wenn dieser Sprung in den Gültigkeitsbereich eines
variable-length array
oder eines anderen
variably-modified type
führen würde.
(seit C99)
Ein
Label
ist ein Bezeichner gefolgt von einem Doppelpunkt (
:
)
und einer Anweisung
(bis C23)
. Labels sind die einzigen Bezeichner mit
Funktionsgültigkeitsbereich
: Sie können (in einer goto-Anweisung) überall in derselben Funktion verwendet werden, in der sie auftreten. Vor jeder Anweisung können mehrere Labels stehen.
|
Das Betreten des Gültigkeitsbereichs einer nicht variabel modifizierten Variable ist erlaubt: goto lab1; // OK: going into the scope of a regular variable int n = 5; lab1:; // Note, n is uninitialized, as if declared by int n; // goto lab2; // Error: going into the scope of two VM types double a[n]; // a VLA int (*p)[n]; // a VM pointer lab2:
Wenn
{ int n = 1; label:; int a[n]; // re-allocated 10 times, each with a different size if (n++ < 10) goto label; // leaving the scope of a VM } |
(seit C99) |
Schlüsselwörter
Hinweise
|
Da Deklarationen keine Anweisungen sind, muss eine Marke vor einer Deklaration eine Null-Anweisung verwenden (ein Semikolon unmittelbar nach dem Doppelpunkt). Gleiches gilt für eine Marke vor dem Ende eines Blocks. |
(bis C23) |
C++ legt zusätzliche Einschränkungen für die
goto
-Anweisung fest, erlaubt jedoch Labels vor Deklarationen (welche in C++ Anweisungen sind).
Beispiel
#include <stdio.h> int main(void) { // goto kann verwendet werden, um eine mehrstufige Schleife einfach zu verlassen for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { printf("(%d;%d)\n",x,y); if (x + y >= 3) goto endloop; } } endloop:; }
Ausgabe:
(0;0) (0;1) (0;2) (1;0) (1;1) (1;2)
Referenzen
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.8.6.1 Die goto-Anweisung (S: 110-111)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.8.6.1 Die goto-Anweisung (S: 152-153)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.8.6.1 Die goto-Anweisung (S: 137-138)
- C89/C90-Standard (ISO/IEC 9899:1990):
-
- 3.6.6.1 Die goto-Anweisung
Siehe auch
|
C++ Dokumentation
für
goto
Anweisung
|