Namensräume
Varianten
Aktionen

goto-Anweisung

Von cppreference.com
< c‎ | Sprache

Ü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 goto den Gültigkeitsbereich eines VLA verlässt, wird es deallokiert (und kann neu allokiert werden, wenn seine Initialisierung erneut 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)

[bearbeiten] Schlüsselwörter

goto

[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