<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Sprunganweisung</id>
	<title>Sprunganweisung - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Sprunganweisung"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Sprunganweisung&amp;action=history"/>
	<updated>2026-06-12T15:29:53Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Sprunganweisung&amp;diff=61153&amp;oldid=prev</id>
		<title>imported&gt;Laserjones: /* Bekannte Sprunganweisungen */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Sprunganweisung&amp;diff=61153&amp;oldid=prev"/>
		<updated>2026-04-13T00:42:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Bekannte Sprunganweisungen&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Sprunganweisung&amp;#039;&amp;#039;&amp;#039; oder ein &amp;#039;&amp;#039;&amp;#039;Sprungbefehl&amp;#039;&amp;#039;&amp;#039; ist eine [[Anweisung (Programmierung)|Anweisung]] in einer [[Programmiersprache]]. In [[Computerprogramm]]en dient sie dazu, die Verarbeitung nicht mit dem nachfolgenden Befehl, sondern an einer beliebigen Stelle fortzuführen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Sprunganweisungen ==&lt;br /&gt;
Die bekannteste Sprunganweisung ist das sogenannte &amp;#039;&amp;#039;&amp;#039;Goto&amp;#039;&amp;#039;&amp;#039; (von {{enS|go to}} gehe zu, nach). Dies ist in der [[Programmierung]] ein Befehl im Programmcode, der einen Sprung zu einer anderen Stelle im [[Computerprogramm|Programm]] bewirkt.&lt;br /&gt;
&lt;br /&gt;
Verzweigungen zu [[Unterprogramm]]en (auch: [[Subroutine]] und [[Funktion (Programmierung)|Function]]) werden mittels &amp;#039;&amp;#039;&amp;#039;Call&amp;#039;&amp;#039;&amp;#039; oder ähnlich lautenden Befehlen (je nach Programmiersprache und Unterprogrammtyp) ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Rücksprung&amp;#039;&amp;#039;&amp;#039; ist die Rückkehr zu der Stelle, an der das (Haupt-)Programm nach einem solchen Aufruf und der Ausführung eines Unterprogramms fortzusetzen ist – häufig veranlasst durch eine &amp;#039;&amp;#039;&amp;#039;Return&amp;#039;&amp;#039;&amp;#039;-Anweisung im Unterprogramm.&lt;br /&gt;
&lt;br /&gt;
Jedoch wird auch der Sprung zurück an eine schon einmal besuchte Stelle im Programmcode, also die Wiederholung eines Programmabschnitts in einer [[Schleife (Programmierung)|Schleife]], als Rücksprung bezeichnet.&lt;br /&gt;
Anstelle von Goto-Anweisungen werden in modernen Programmierverfahren sogenannte [[Kontrollstruktur]]en verwendet; Details siehe [[#Kontrollstruktur|unten]].&lt;br /&gt;
&lt;br /&gt;
== Sprunganweisungen auf Maschinenebene ==&lt;br /&gt;
&amp;lt;!-- Zu diesem Abschnitt könnte man einen eigenen Artikel unter [[Branch (Maschinenbefehl)]] anlegen, wie auf WP:en. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu den Hochsprachen spricht man hier häufiger von &amp;#039;&amp;#039;Sprungbefehlen&amp;#039;&amp;#039; als von &amp;#039;&amp;#039;Sprunganweisungen&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Prozessor]]en kennen in der Regel mehrere verschiedene Sprungbefehle. Diese kann man einteilen in:&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;unbedingt&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;bedingt&amp;#039;&amp;#039;&lt;br /&gt;
: Der Sprung wird entweder immer ausgeführt oder nur wenn bestimmte Flags im [[Statusregister]] bestimmte, geforderte Werte haben. Um welche Werte und Flags es sich handelt, ist dabei in der Sprunganweisung codiert (Beispiel: JNZ bedeutet Jump (if) Not Zero).&lt;br /&gt;
; &amp;#039;&amp;#039;absolut, relativ, Register&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Speicher&amp;#039;&amp;#039;&lt;br /&gt;
* Das Programm wird an der angegebenen Adresse fortgeführt.&lt;br /&gt;
* Es erfolgt der Sprung relativ zur aktuellen Position. Damit ist verschiebbarer (relozierbarer) Code möglich.&lt;br /&gt;
* Die Zieladresse steht in einem Register &amp;lt;code&amp;gt;JMP reg&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Die Adresse des Sprungziels steht im Speicher &amp;lt;code&amp;gt;JMP [reg]&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;JMP [reg+offs]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Eine besondere Form von Sprungbefehlen sind [[Unterprogramm]]aufrufe, d.&amp;amp;nbsp;h. Sprünge mit Rückkehrabsicht. Bei deren Ausführung wird zuerst die Adresse des Folgebefehls gesichert (auf dem [[Stapelspeicher|Stack]] oder in einem Register),&amp;lt;ref&amp;gt;{{Internetquelle |url=http://bitsavers.org/pdf/ibm/360/princOps/A22-6821-0_360PrincOps.pdf |titel=IBM System/360 Principles of Operation |hrsg=[[IBM]] |seiten=64 |datum=1964 |format=PDF |sprache=en |kommentar=Befehlsbeschreibung zu „Branch and Link“: BAL, BALR |abruf=2015-02-02}}&amp;lt;/ref&amp;gt; erst dann wird an die Zieladresse gesprungen. Über &amp;#039;&amp;#039;Rücksprungbefehle&amp;#039;&amp;#039; kann das Unterprogramm wieder an die ursprüngliche Position zurückkehren und das Programm so fortgesetzt werden. Die Rücksprungadresse wird vom Stack entnommen oder steht in einem Register.&lt;br /&gt;
&lt;br /&gt;
== Sprunganweisungen auf Hochsprachenebene ==&lt;br /&gt;
In höheren [[Programmiersprache]]n ist eine &amp;#039;&amp;#039;Sprunganweisung&amp;#039;&amp;#039; eine Anweisung der Form&lt;br /&gt;
 goto &amp;#039;&amp;#039;Markenname&amp;#039;&amp;#039;&lt;br /&gt;
oder&lt;br /&gt;
 if &amp;#039;&amp;#039;Bedingung&amp;#039;&amp;#039;&lt;br /&gt;
     goto &amp;#039;&amp;#039;Markenname&amp;#039;&amp;#039;&lt;br /&gt;
Im ersten Fall wird sie &amp;#039;&amp;#039;unbedingte Sprunganweisung&amp;#039;&amp;#039;, im zweiten &amp;#039;&amp;#039;bedingte Sprunganweisung&amp;#039;&amp;#039; genannt. Dabei steht &amp;lt;code&amp;gt;Markenname&amp;lt;/code&amp;gt; für den Namen einer [[Label (Programmierung)|Sprungmarke]], die an einer anderen Stelle des Programms definiert ist. Bei der Abarbeitung des Programms wird an der Stelle fortgesetzt, an der die Sprungmarke steht.&lt;br /&gt;
&lt;br /&gt;
{{Anker|Kontrollstruktur}}&lt;br /&gt;
Im Prinzip könnte man allein mit bedingten Sprunganweisungen und einigen Zusatzfunktionen für Datenein- und -ausgabe jeden [[Algorithmus]] programmieren. Die entstehenden Programme sind allerdings ab einer gewissen Größe nahezu [[Wartbarkeit|unwartbar]]. In aktuellen Programmiersprachen werden explizit formulierte Sprunganweisungen deshalb selten verwendet. Stattdessen werden häufiger höherwertige [[Kontrollstruktur]]en, insbesondere Schleifen, Unterprogrammaufrufe und bedingt auszuführende Programmblöcke, eingesetzt, in denen die logisch dazugehörenden Verzweigungs- und Rückverzweigungsbefehle implizit, d.&amp;amp;nbsp;h. vom [[Übersetzer]] im [[Maschinencode]] eingefügt werden, ohne dass ein Goto programmiert werden muss.&lt;br /&gt;
&lt;br /&gt;
== GOTO-Varianten ==&lt;br /&gt;
&lt;br /&gt;
In der maschinennahen Programmierung dient der Goto-Befehl dazu, zu einer anderen [[#Sprunganweisungen auf Maschinenebene|Stelle im Programm]] zu verzweigen, entweder unbedingt oder von einer Bedingung abhängig. In manchen [[Assemblersprache]]n heißt der entsprechende Goto-Befehl &amp;#039;&amp;#039;JMP&amp;#039;&amp;#039; ({{enS|jump}} Sprung) oder BR ({{enS|branch}} verzweigen).&lt;br /&gt;
&lt;br /&gt;
In höheren [[Programmiersprache]]n (die ggf. auch eine Kleinschreibung erlauben) wird durch einen Goto-Befehl entweder eine Code-Zeilennummer (zum Beispiel in alten [[BASIC]]-Dialekten) oder eine definierte Sprungmarke (&amp;#039;&amp;#039;Label&amp;#039;&amp;#039;, zum Beispiel in [[C (Programmiersprache)|C]] oder [[Pascal (Programmiersprache)|Pascal]]) angesprochen.&lt;br /&gt;
&lt;br /&gt;
Beispiel eines einfachen Programms mit Goto in Pascal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
PROGRAM beispiel;&lt;br /&gt;
LABEL 10;&lt;br /&gt;
BEGIN&lt;br /&gt;
    10:&lt;br /&gt;
    writeln(&amp;#039;Endlosschleife&amp;#039;);&lt;br /&gt;
    GOTO 10;&lt;br /&gt;
END.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das folgende Programmbeispiel (aus dem Essay &amp;#039;&amp;#039;Coding Style&amp;#039;&amp;#039; von [[Linus Torvalds]])&amp;lt;ref&amp;gt;[https://www.kernel.org/doc/html/latest/process/coding-style.html#centralized-exiting-of-functions Linux kernel coding style, Chapter 7: Centralized exiting of functions] (englisch)&amp;lt;/ref&amp;gt; zeigt die Verwendung eines Goto-Befehls &amp;lt;code&amp;gt;goto out&amp;lt;/code&amp;gt; in [[C (Programmiersprache)|C]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int fun(int a) {&lt;br /&gt;
    int result = 0;&lt;br /&gt;
    char *buffer = kmalloc(SIZE);&lt;br /&gt;
&lt;br /&gt;
    if (buffer == NULL)&lt;br /&gt;
        return -ENOMEM;&lt;br /&gt;
&lt;br /&gt;
    if (condition1) {&lt;br /&gt;
        while (loop1) {&lt;br /&gt;
            // ...&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        result = 1;&lt;br /&gt;
        goto out;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ...&lt;br /&gt;
out:&lt;br /&gt;
    kfree(buffer);&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In frühen Varianten älterer Programmiersprachen wie [[Fortran]] oder [[BASIC]] stellten Goto-Befehle noch die wichtigste, teilweise sogar die einzige Möglichkeit zur Steuerung des Programmflusses dar; diese wurden deshalb auch zur Realisierung von Schleifen und bedingter Ausführung verwendet. Dies führte zu [[Spaghetticode]].&lt;br /&gt;
&lt;br /&gt;
Mit der Programmiersprache [[ALGOL]] wurden 1960 eigene Kontrollstrukturen wie &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;if-else&amp;lt;/code&amp;gt; zur Programmierung von Schleifen und [[Bedingte Anweisung und Verzweigung|bedingten Anweisungen und Verzweigungen]] eingeführt. Diese Neuerungen wurden bald in andere Programmiersprachen übernommen. So machen &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; als Ersatz für Rücksprünge und &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; als Ersatz für Vorwärtssprünge bei geeigneter Umstrukturierung eines jeden Programms die Goto-Anweisung theoretisch überflüssig.&lt;br /&gt;
&lt;br /&gt;
Die [[strukturierte Programmierung]] und die GOTO-Programmierung sind jedoch aus Sicht der theoretischen Informatik äquivalent; alle solchen Programme fallen in die Kategorie der [[GOTO-Programm]]e.&lt;br /&gt;
&lt;br /&gt;
Auch in anderer Hinsicht sind die Befehle der strukturierten Programmierung mit dem GOTO äquivalent: Der Befehlssatz eines Prozessors enthält in der Regel keine explizite Unterstützung von Konstrukten wie &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;repeat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;if-else&amp;lt;/code&amp;gt; etc. Daher werden diese bei der Kompilierung eines Programms vom Compiler mittels unbedingter und bedingter Sprunganweisungen (Mnemonik: JP, JMP, J&amp;#039;&amp;#039;cond&amp;#039;&amp;#039;, BR, B&amp;#039;&amp;#039;cc&amp;#039;&amp;#039;, …) nachgebildet. Die genannten Konstrukte bieten also keine neuen Möglichkeiten, sie sind jedoch sinnvoll, um lesbaren und damit wartungsfreundlicheren Code zu forcieren.&lt;br /&gt;
&lt;br /&gt;
== Umstrittene Verwendung von GOTO ==&lt;br /&gt;
1968 sprach sich [[Edsger W. Dijkstra]] in seinem Aufsatz &amp;#039;&amp;#039;Go To Statement Considered Harmful&amp;#039;&amp;#039; (ursprünglich: &amp;#039;&amp;#039;A Case against the GO TO Statement&amp;#039;&amp;#039;; der spätere Titel geht auf [[Niklaus Wirth]] zurück), für eine Abschaffung des Goto-Befehls in allen [[Höhere Programmiersprache|höheren Programmiersprachen]] aus.&amp;lt;ref&amp;gt;{{Literatur |Autor=Edsger W. Dijkstra |Titel=Letters to the editor: Go To Statement Considered Harmful |Sammelwerk=Communications of the ACM |Band=11 |Nummer=3 |Datum=1968-03 |Seiten=147–148 |DOI=10.1145/362929.362947}}&amp;lt;/ref&amp;gt; Das ist ohne weiteres möglich, da nahezu jedes Goto durch sogenannte [[Kontrollstruktur]]anweisungen wie &amp;lt;code&amp;gt;do&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; ersetzt werden kann (siehe auch [[GOTO-Programm#Simulation durch WHILE-Programm|Simulation GOTO durch WHILE]]). Nach anfänglichem Widerstand wurde diese Meinung in der Programmierausbildung bald zum Dogma erhoben; in einigen Sprachen wie [[Java (Programmiersprache)|Java]] wurde bewusst überhaupt kein Goto-Befehl eingeführt, jedoch ersatzweise ein &amp;#039;&amp;#039;&amp;lt;span lang=&amp;quot;en&amp;quot;&amp;gt;labeled break&amp;lt;/span&amp;gt;&amp;#039;&amp;#039; und später ein &amp;#039;&amp;#039;&amp;lt;span lang=&amp;quot;en&amp;quot;&amp;gt;labeled continue&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;. Dennoch ist &amp;lt;code&amp;gt;goto&amp;lt;/code&amp;gt; als Schlüsselwort auch in Java reserviert. Evtl. behält man sich die Implementierung vor, wahrscheinlich aber auch aus praktischen Gründen. Ansonsten wäre &amp;#039;&amp;#039;goto&amp;#039;&amp;#039; ein gültiger Bezeichner. Andererseits unterstützen zahlreiche neue imperative Programmiersprachen noch Goto, z.&amp;amp;nbsp;B. [[C++]], und selbst das 2000 entwickelte [[C-Sharp|C#]] sowie das 2007 publizierte [[D (Programmiersprache)|D]]. 2009 wurde Goto nachträglich auch in die Skriptsprache [[PHP]] ab Version 5.3 eingeführt und war in der neuen Sprache [[Go (Programmiersprache)|Go]] enthalten.&lt;br /&gt;
&lt;br /&gt;
Eine weniger kritisierte Variante des Goto-Befehls ist das vorzeitige Verlassen eines Unterprogramms durch &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;, das Abbrechen einer Schleife durch &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; oder Abbrechen eines bestimmten Schleifendurchlaufs und den Beginn des nächsten Durchlaufs durch &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt;. Trotzdem gilt es in einigen Programmiersprachen als guter [[Programmierstil]], wenn ein Block genau einen [[Einsprungpunkt]] und genau einen Ausstiegspunkt hat. In Sprachen, welche [[Ausnahmebehandlung]]en erlauben, wird dagegen die Ein-Ausstiegspunkt-Regel als obsolet angesehen, da &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt;-Anweisungen die Argumentation hinter dieser Regel ad absurdum führen.&lt;br /&gt;
&lt;br /&gt;
In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf Goto zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt.&amp;lt;ref&amp;gt;{{Literatur |Autor=Frank Rubin |Hrsg=ACM |Titel=“GOTO Considered Harmful” Considered Harmful |Sammelwerk=Communications of the ACM |Band=30 |Nummer=3 |Datum=1987-03 |Seiten=195–196 |DOI=10.1145/214748.315722 |Online=[https://web.archive.org/web/20090320002214/http://www.ecn.purdue.edu/ParaMount/papers/rubin87goto.pdf web.archive.org] |Format=PDF |KBytes=208 |Abruf=2021-09-11}}&amp;lt;/ref&amp;gt; So hält [[Donald E. Knuth]] Goto für die optimale Lösung einiger üblicher Programmierprobleme.&amp;lt;ref&amp;gt;{{Literatur |Autor=Donald E. Knuth |Hrsg=ACM |Titel=Structured Programming with go to Statements |Sammelwerk=Computing Surveys |Band=6 |Nummer=4 |Datum=1974 |Seiten=261–301 |DOI=10.1145/356635.356640 |Online=[http://www.clifford.at/cfun/cliffdev/p261-knuth.pdf Online] |Format=PDF |KBytes=2900 |Abruf=2021-09-11}}&amp;lt;/ref&amp;gt; Besonders in zeitkritischen Programmteilen ist ein Goto deutlich effizienter, als am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
Von einigen Entwicklern wurde auf der Linux-Kernel-Mailing-Liste die häufige Verwendung von Goto im Quellcode von [[Linux]] diskutiert. [[Linus Torvalds]] sagte dabei, dass die Verwendung von Goto die Lesbarkeit des Quellcodes in vielen Fällen sogar deutlich erhöhen könne.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://kerneltrap.org/node/553/2131 |titel=Linux: Using goto In Kernel Code |hrsg=kerneltrap.org |sprache=en |archiv-url=https://web.archive.org/web/20051128093253/http://kerneltrap.org/node/553/2131 |archiv-datum=2005-11-28 |offline=1 |abruf=2010-09-21}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Sprungtabelle]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Edsger W. Dijkstra: &amp;#039;&amp;#039;Go To Statement Considered Harmful.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;[[Communications of the ACM]].&amp;#039;&amp;#039; Vol. 11, No. 3, März 1968, S. 147–148 ([http://portal.acm.org/ft_gateway.cfm?id=362947&amp;amp;type=pdf&amp;amp;coll=GUIDE&amp;amp;dl=GUIDE&amp;amp;CFID=86187909&amp;amp;CFTOKEN=55343279 PDF])&lt;br /&gt;
* David R. Tribble: [http://david.tribble.com/text/goto.html &amp;#039;&amp;#039;Go To Statement Considered Harmful: A Retrospective&amp;#039;&amp;#039;.] 27. November 2005&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Laserjones</name></author>
	</entry>
</feed>