Angenommen, ich habe eine Schleife in C ++ oder C #, die so aussieht:
while( true ) {
doSomething();
if( condition() ) {
break;
}
doSomethingElse();
}
Dies wird allgemein als "Endlosschleife" bezeichnet. Technisch gesehen ist es jedoch nicht unendlich - es wird aufhören, sobald die Kontrolle durchfließt break
.
Was ist der Begriff für eine solche Schleife - die "loop forever" -Schleifensteueranweisung und "break" enthält?
terminology
scharfer Zahn
quelle
quelle
condition()
immer false zurückgegeben wird? Ich würde sagen, es ist eine Endlosschleife mit bedingten Pausen.break
ist die Schleife nicht unendlich (kill
, Strg-Alt-Entf, Stecker ziehen ...). Warum sollten Sie sich also mit Terminologiedetails beschäftigen?Antworten:
Dieser Professor hat CS studiert und uns beigebracht, dass es Pre-Checking-Schleifen (
while(cond) {}
), Post-Checking-Schleifen (do {} while(cond);
) und Middle-Checking-Schleifen gibt . (Ich habe das vielleicht schlecht ins Englische übersetzt, aber Sie haben die Idee.)C und C ++ haben das letztere nicht (ISTR Ada hat es, BICBW), also wird Ihr Konstrukt für das in C und C ++ verwendet.
quelle
loop ... exit when condition; ... end loop;
Der allererste Kurs in CS bei Stanford ( Programming Methodology von Mehran Sahami ) bezeichnet dies als eineinhalb Schleife . Und es ist nicht unbedingt eine schlechte Programmierpraxis. Betrachten Sie das folgende Beispiel zum Sammeln von Benutzereingaben (entnommen aus " The Art and Science of Java" von Eric Roberts , wo Roberts es auch als eineinhalb Schleife bezeichnet ):
Und dann das Gleiche, das mit der eineinhalb- minütigen Schleife gelöst wurde , um doppelten Code zu vermeiden:
quelle
Ohne offiziellen Namen würde ich es Broken Loop nennen . Die Mehrdeutigkeit dieses Begriffs ist beabsichtigt, da eine Unterbrechung in der Mitte einer Schleife ein bisschen unrein ist, fast wie eine
goto
.quelle
goto
auch hatte gültige Anwendungen, zB Emulation eines try ... schließlich in C. blockierenwhile(XEventGet(&ev) != NULL){ ... }
, sind Sie natürlich die Schlüssel in der Schleife überprüfen , gehen zu wollen:if(ev.key == XK_q) break;
. Folgendes tunwhile(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }
:, ist hässlich und wahrscheinlich schwerer zu lesen als eine Pause in der Mitte der Schleife. Und was ist, wenn etwas zuerst auf den Wert eingestellt werden muss, bevor es überprüft werden kann? Du wirst das alles nicht ernsthaft in den Basisfall der Schleife stecken, oder?Es gibt keinen endgültigen Namen. Endlosschleife ist, denke ich, der passende Begriff. Keine Schleife ist wirklich unendlich, aber dies hat das Potenzial, effektiv unendlich zu sein, da es möglich ist, dass der Zweig, der die Unterbrechung enthält, niemals auftritt.
Wenn Sie jemandem sagen, "erstelle eine Endlosschleife und verwende eine Unterbrechung für Bedingung X", wird er wissen, was Sie meinen. Wenn jemand Ihren Code überprüft und nichts weiter sagt als "Ich mag die Endlosschleife, die Sie geschrieben haben, nicht", wissen Sie, wovon er spricht (es sei denn, Sie haben natürlich mehr als eine).
quelle
while
Schleife, und die Art und Weise, wie Sie den Abbruchnachweis erbringen, ist genau dieselbe (eine monoton abnehmende Metrik zu finden, ist ein guter Anfang).Es ist eine Do-While-Schleife mit der Bedingung an der falschen Stelle.
quelle
break
odercontinue
. Vermeiden Sie Sentinel-Werte um jeden Preis. Sie sind nur ein willkürlicher Zustand, den Sie im Kopf behalten müssen und der den Zweck des Codes verschleiert.Ich würde für "bedingungslose Schleife" stimmen , ähnlich wie "bedingungsloser Sprung". Es zeigt genau, was los ist (der Code schleift bedingungslos), ohne zu lügen (im Gegensatz zu "Endlosschleife").
quelle
if
/break
in der Mitte ist Teil des Musters.Es ist eine Endlosschleife mit einer Unterbrechungsbedingung.
Ich würde mit ammilind, dass zustimmen , wenn Sie es einen besonderen Namen geben wollte man es nennen könnte ein Infinite Partial - Loop
quelle
In Rosetta Code wird dieses spezielle Muster als "N plus eine halbe" Schleife beschrieben . Obwohl es nicht mein Lieblingsbegriff ist, ist es nicht schrecklich und ist eindeutig ein Muster, das für einige Arten von Schleifen nützlich ist. (Die Alternativen sind das Duplizieren des Vor-der-Bedingung-Codes - möglicherweise schwierig in realen Programmen - oder das Erhöhen der Verschachtelungstiefe des Nach-der-Bedingung-Codes, während eine Schleifenbedingungsvariable hinzugefügt wird; weder die Wartbarkeit noch die Verständlichkeit des Codes werden verbessert Der einzige Grund, solche Konstrukte abzulehnen, ist, wenn man darauf besteht, Schleifen zu schreiben, um frei zu sein
break
.)quelle
Es gibt keinen Standardbegriff, aber ich würde es als Teilschleife bezeichnen .
Diese Schleife wird verwendet, wenn Sie nur einen Teil der Schleife ein letztes Mal ausführen möchten (dh eine teilweise Ausführung). Es wird verwendet, wenn Sie keine geeignete Situation finden, in der Sie die gesamte Schleife unterbrechen möchten .
In diesem Fall möchten Sie die Schleife unterbrechen, nachdem Sie sie mindestens
doSomething()
ein letztes Mal ausgeführt haben.quelle
Ich muss mich hier mit sbi einverstanden erklären - ich mag den Begriff des mittleren Prüfkreises . Diese Art von Konstrukt war populärer, als Structured Programming begann, und viele Sprachen hatten syntaktische Unterstützung für sie.
Das heißt, es ist mittlerweile weit verbreitet, dass
while
Schleifen in der Regel besser zu handhaben sind, da es einfacher ist, über Invarianten nachzudenken, und sie den schwierigen leeren Fall häufig besser handhaben.In Ihrem speziellen Fall ist Ihre Schleife nur äquivalent zu
Daher würde ich die
break
Version nur verwenden, wenn einedoSomething
oderdoSomethingElse
mehrere Anweisungen vorhanden sind, und sie lieber nicht wie Sie in separate Funktionen einteilen.Das heißt, wenn Ihre Schleife komplizierter ist als eine Iteration (Starten, Prüfen, Inkrementieren), sollten Sie überlegen, sie in etwas Einfacheres umzugestalten.
quelle
Ich denke, wenn wir versuchen werden, einen Begriff dafür zu finden, vielleicht:
quelle
Ich nenne es, was es ist, eine "while true loop".
Siehe auch ist dabei (wahr) schlechte Programmierpraxis?
quelle
Es ist nicht in jedem Fall so schlimm. Ich finde mich dabei, diese Art von Schleifen mit bestimmten Arten von APIs zu schreiben. Nehmen wir zum Beispiel an, Sie haben ein Schleifenobjekt und müssen nach Bedingungen suchen, die ziemlich tief in diesem Objekt liegen, wie zum Beispiel:
Angenommen, jede getXXX-Methode könnte möglicherweise null zurückgeben. Dann wäre es immer noch möglich, einen booleschen Ausdruck zu schreiben, obwohl dieser ziemlich kompliziert und unleserlich ist. Und dann müssen wir fast das gleiche wiederholen, um das aktuelle Handler-Objekt zu erhalten. In solchen Fällen fällt es mir leichter, eine
while (true)
Schleife mit break zu schreiben und fortzufahren.quelle