Namespaces
Variants

goto statement

From cppreference.net

Ü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 goto den Gültigkeitsbereich einer VLA verlässt, wird diese freigegeben (und kann erneut allokiert werden, falls ihre Initialisierung wieder ausgeführt wird):

{
   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

goto

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