next up previous contents
Next: switch-Anweisung Up: Kontrollstrukturen Previous: break und continue

goto-Anweisung, Labels

Zu dem Zweck, tiefer verschachtelte Schleifen zu verlassen, kann die goto Anweisung benutzt werden.

void f(){
  int a[20][30];
 
  for( int i=0; i<20; i++ )
    for( int j=0; j <30; j++ )
       if ( a[i][j] == 42. )  // found the answer
         goto end_of_loop;    // multi level break
end_of_loop:                  // label, we jump here from inside the loop

Der Label (Name) end_of_loop kennzeichnet das Sprungziel des goto. Der Name des Sprungzieles kann innerhalb des Funktionskörpers frei gewählt werden und wird durch einen Doppelpunkt abgeschlossen. Das Problematische an goto-Anweisungen ist, daß man einem Label nicht ansehen kann, von wo aus sie mit goto angesprungen werden. Außerdem erzwingt häufig die Verwendung eines goto die Verwendung mindestens eines weiteren. Im obigen Beispiel müßte vermutlich nach der Schleife eine Behandlung des ``nicht-gefunden'' Falles anschließen und man müßte dann das Ansprungziel des goto mit einem weiteren goto umgehen. Besser setzt man oben eine Variable found auf einen bestimmten Wert und benutzt diesen dann in weiteren Verzweigungsanweisungen.

Mit goto dürfen lokale Blöcke/Klammerebenen verlassen, aber nicht betreten werden. Man darf beispielsweise nicht vom if-Teil einer Entschiedung in den else-Teil springen, oder von außen in einen Block/Schleifenkörper hinein. Ebenso darf der Kontext einer Funktion nicht verlassen werden.

Programmierweisheit besagt: goto's können immer vermieden werden (im Prinzip durch Ersetzen des goto durch die Anweisungen nach dem Sprungziel), sind allerdings in seltenen Einzelfällen bei der Strukturierung hilfreich.


next up previous contents
Next: switch-Anweisung Up: Kontrollstrukturen Previous: break und continue
© R.Hilfer et al., ICA-1, Univ. Stuttgart
28.6.2002