goto-Anweisung
Überträgt die Kontrolle unbedingt an die gewünschte Stelle.
Wird verwendet, wenn es ansonsten unmöglich ist, die Kontrolle mit herkömmlichen Konstrukten an die gewünschte Stelle zu übertragen.
Inhalt |
[bearbeiten] Syntax
attr-spec-seq(optional) goto label ; |
|||||||||
| label | - | Ziel-Label für die goto-Anweisung |
| attr-spec-seq | - | (C23)optionale Liste von Attributen, die auf die goto-Anweisung angewendet werden |
[bearbeiten] Erklärung
Die goto-Anweisung bewirkt einen bedingungslosen Sprung (Kontrollübertragung) zur Anweisung, der das benannte Label vorangestellt ist (das sich in derselben Funktion wie die goto-Anweisung befinden muss), es sei denn, dieser Sprung würde den Gültigkeitsbereich eines variablen Arrays oder eines anderen variablen Typs betreten.(seit C99)
Ein Label ist ein Bezeichner, gefolgt von einem Doppelpunkt (:) und einer Anweisung(bis C23). Labels sind die einzigen Bezeichner, die einen Funktionsumfang haben: Sie können (in einer goto-Anweisung) überall in derselben Funktion verwendet werden, in der sie erscheinen. Vor einer Anweisung können mehrere Labels stehen.
|
Das Betreten des Gültigkeitsbereichs einer nicht-variablen Variablen 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) |
[bearbeiten] Schlüsselwörter
[bearbeiten] Anmerkungen
|
Da Deklarationen keine Anweisungen sind, muss ein Label vor einer Deklaration eine Null-Anweisung verwenden (ein Semikolon unmittelbar nach dem Doppelpunkt). Gleiches gilt für ein Label vor dem Ende eines Blocks. |
(bis C23) |
C++ legt zusätzliche Einschränkungen für die goto-Anweisung fest, erlaubt jedoch Labels vor Deklarationen (die in C++ Anweisungen sind).
[bearbeiten] Beispiel
#include <stdio.h> int main(void) { // goto can be used to leave a multi-level loop easily 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)
[bearbeiten] 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
[bearbeiten] Siehe auch
| C++-Dokumentation für die
goto-Anweisung |