goto
Anweisung, Labels:
Die goto
-Anweisung ist abgeleitet vom englischen Go-To
und führt explizit eine Verzweigung an eine andere Stelle im Code aus. Solche Stellen werden als Labels
definiert.
Ein Label besteht aus einem eindeutigen Namen und einem Doppelpunkt :
und kennzeichnet irgendwo im lauffähigen Code eine Stelle, an die gesprungen werden kann. Ein Label wird deswegen auch als eine Sprungadresse
bezeichnet, auf dieser Seite wird jedoch auf diesen Begriff verzichtet.
Details
Die goto
-Anweisung gilt heutzutage als verpönt, da alle möglichen Sprungbefehle mittels anderer Kontrollstrukturen konstruiert werden können. Diese Anweisung wird nur noch äusserst selten verwendet.
Labels werden vom Compiler zuerst in ein neues, eindeutiges Assembler-Label und danach in eine Adresse umgewandelt, welche für den Prozessor die Position der nächsten auszuführenden Instruktion angibt. Kontrollstrukturen wie for
-Schleifen oder die if-else
-Struktur werden vom Compiler ebenfalls umgesetzt, indem künstliche Labels in den Assembler-Code eingefügt werden und aufgrund von Auswertungen auf Prozessor-Ebene an dieselben verzweigt wird. Folgendes Beispiel zeigt einen Ausschnitt aus den vom Compiler hergestellten (und nicht optimierten) Assembler-Befehlen für eine if-else
-Entscheidung:
if(i == 1){
i++;
}else{
i--;
}
Hier wurden die beiden Labels L2
und L4
eingefügt. L2
entspricht dabei der Adresse, welche angesprungen wird, wenn i
ungleich (jne
) 1
ist, und L4
entspricht dem Ende des if
-Blocks, zu welchem am Ende des true
-Teiles gesprungen (jmp
) werden muss.
Spezielle Labels
Es gibt einige Labels, oder Keywords, denen eine spezielle Bedeutung zukommt. Diese können jedoch NICHT mittels der goto
-Anweisung angesprungen werden:
case X:
Dieses Label kennzeichnet einen explizit ausprogrammierten Teil einer switch
Struktur zu welchem gesprungen wird, wenn die Bedingung den Wert X ergibt. Ausserhalb der zugehörigen switch
-Struktur hat dieses Label keine Gültigkeit.
default:
Dies ist das Label einer switch
Struktur, welche den Teil markiert, welcher aufgerufen wird, wenn alle anderen Teile nicht zutreffen. Ausserhalb der zugehörigen switch
-Struktur hat dieses Label keine Gültigkeit.