WikiDer > Endlosschleife
EIN Endlosschleife ist eine Reihe von Anweisungen in a Computer Programm was in unendlich wiederholen ('einhängen Englisch: gehen) durchgeführt. Dies kann daran liegen, dass die Schleife unter keinen Bedingungen endet oder weil die Schleife nur unter bestimmten Bedingungen endet, die nie erreicht werden können. In älteren Betriebssysteme mit kooperatives Multitasking Dies könnte dazu führen, dass das gesamte System nicht mehr reagiert. Beim mittlerweile weit verbreiteten präemptiven Multitasking sorgt eine Endlosschleife dafür, dass das System Prozessorzeit verwendet, kann aber in der Regel vom Benutzer beendet werden.
Schleife
EIN Schleife ist ein Kontrollstruktur im Programmiersprachen mit dem eine Anzahl von Anweisungen wiederholt ausgeführt werden kann, bis eine bestimmte Bedingung(en) erfüllt ist. Eine Endlosschleife tritt auf, wenn diese Bedingung(en) nie erfüllt werden, beispielsweise aufgrund inhärenter Eigenschaften der Schleife.
Beispiel
Ein Beispiel in BASIC:
10DRUCKEN"Hallo Welt"20GEHE ZU10Im obigen Beispiel ist die Endlosschleife offensichtlich, da sich die letzte Zeile immer auf die erste Zeile bezieht, in der die Ausführung fortgesetzt wird. Unerwartetes Verhalten in der Abbruchbedingung kann auch eine Endlosschleife verursachen. Ein Beispiel dafür (in der Programmiersprache C):
schwebenX=0.1;während(X!=1.1){druckenf("x = %f",X);X=X0.1;}Auf einigen Computern wird diese Schleife erwartungsgemäß zehnmal ausgeführt, auf anderen wird die Schleife jedoch nie enden. Das hat damit zu tun, wie Gleitkommazahlen werden auf Systemen präsentiert. Das Problem ist, dass die Bedingung while(x != 1.1) eine genaue Übereinstimmung zwischen zwei Gleitkommazahlen ist erforderlich. Auf einigen Systemen kann die Zahl 1.1 nicht exakt dargestellt werden, sodass der Test nie bestanden wird. Als Ergebnis wird die Schleife nie enden und eine unendliche Wiederholung verursachen.
Da die Möglichkeit besteht, dass die Gleichheit zwischen Gleitkommazahlen nicht exakt durchgeführt werden kann, ist es besser, bei Gleitkommazahlen zu prüfen, ob die Zahlen größer oder kleiner alseinander sind, wie z x >= 1,1 (hier werden sowohl Gleichheit als auch größer als geprüft) oder x < 1,2. Dadurch wird die Ausführung nach einiger Zeit definitiv beendet, unabhängig von der Darstellung der Zahlen auf dem System. Eine andere Möglichkeit, dieses Problem zu lösen, ist die Verwendung von ganze Zahlen (ganze Zahlen).
Ein ähnliches Problem tritt beim Ausführen von uitvoeren auf numerische Mathematik; ein bestimmtes Ergebnis berechnen, Berechnungen iterativ durchgeführt, bis die Differenz zwischen der berechneten Antwort und der tatsächlichen Antwort kleiner als ein bestimmter Wert ist. Aufgrund von Rundungsfehlern während der Iteration wird diese Bedingung möglicherweise nie erfüllt.
Bis zum Quellcode eines Computerprogramms ist es oft möglich, Endlosschleifen zu erkennen. Es gibt jedoch kein allgemeines Verfahren zum Bestimmen, ob ein Computerprogramm endet oder auf unbestimmte Zeit fortgesetzt wird. Das wird es sein Stoppproblem erwähnt.
Pseudo-unendliche Schleifen
Unmögliche Kündigungsbedingung
Einige Schleifen sehen aus wie eine Endlosschleife, sind es aber in der Praxis nicht. Ein Beispiel (in C):
ohne Vorzeichenintich;zum(ich=1;ich>0;ich){/* Code in der Schleife */}Der Index in der for-Schleife beginnt bei value 1 und die Schleife wird nicht enden, bis ich <= 0 (da die Schleife so lange andauert wie ich > 0). Auf den ersten Blick läuft diese Schleife unbegrenzt, in der Praxis wird sie jedoch nach einiger Zeit beendet. Im Laufe der Zeit wird ich den Maximalwert in a . erreicht haben unsigned int gespeichert werden, danach wird 1 hinzugefügt, sodass die Variable auf 0 gesetzt wird. Die Schleife wird dann beendet.
Unendliche Rekursion
Eine andere Technik ist Rekursion: Aufruf derselben Funktion/Methode, um ein Ergebnis zu berechnen. Im folgenden Beispiel in Haskell, eine Funktion ist falsch definiert zu Fakultät eine Zahl berechnen:
fac_error::int->intfac_errornein=nein*fac_error(n-1)Das Problem ist, dass die Rekursion nicht beendet wird. An die Fakultät für nein berechnet werden nein multipliziert mit der Fakultät von n-1.. und das gleiche gilt für n-1, n-2, Ad infinitum. In einer solchen Situation wird die Ausführung beendet, wenn die Stapel wird voll genutzt. Um dies zu lösen, muss ein Basisfall hinzugefügt werden, in diesem Fall für n = 0:
Gesicht::int->intGesicht0=1Gesichtnein=nein*Gesicht(n-1)Die obige Funktion wird für Zahlen n >= 0 Ende. Für negative Zahlen ist die Funktion nicht definiert.