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.