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.




Start.



End.
#include <stdio.h>

int main(int argc, char** argv){
  printf("Start.\n");
  goto End_of_Program;
  printf("Middle.\n");
  End_of_Program:
  printf("End.\n");
  return 0;
}

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--;     
}          
  cmpl	$1, -12(%ebp)
  jne	L2
  leal	-12(%ebp), %eax
  addl	$1, (%eax)
  jmp	L4
L2:
  leal	-12(%ebp), %eax
  subl	$1, (%eax)
L4:

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.