Ein anderes Poster fragte nach bevorzugten Syntax für Endlosschleifen .
Eine Folgefrage: Warum verwenden Sie in Ihrem Code Endlosschleifen? Normalerweise sehe ich ein Konstrukt wie dieses:
%Vor% Damit können Sie den Wert von scoped_variable in der for
- oder while
-Klausel nicht sehen. Was sind andere Anwendungen für "unendliche" Schleifen?
Eine Schleife wie:
%Vor%lässt Sie aus der Schleife in der Mitte ausbrechen, anstatt am Anfang (while / for) oder end (do-while).
Wenn Sie eine komplexe Bedingung haben, können Sie diesen Stil auch verwenden, um den Code übersichtlicher zu gestalten.
Endliche Automaten. Sie sollten nicht enden, bis Sie einen Endzustand erreicht haben, an welchem Punkt Sie brechen oder zurückkehren.
Dies ist ein unvollständiges Beispiel, weil es als Endtestschleife ohne Verlust an Klarheit, Funktion oder Leistung neu strukturiert werden kann.
%Vor%Endlosschleifen werden am häufigsten verwendet, wenn die Schleifeninstanz im einfachsten Fall oben oder unten nicht den Abschlußtest hat. Dies tritt auf, wenn die Schleife aus zwei Teilen besteht: Code, der jedes Mal ausgeführt werden muss, und Code, der nur zwischen jeder Iteration ausgeführt werden muss. Dies geschieht in Sprachen wie C, wenn man beispielsweise aus einer Datei liest oder ein Datenbankresultset verarbeitet, bei dem viel explizit gemacht werden muss. Die meisten Sprachen mit neueren Paradigmen können solchen Code tatsächlich in den Test integrieren.
Ich würde erwägen, eine Endlosschleife zu verwenden, um das Lenksystem einer Rakete zu programmieren.
%Vor%Aus der Perspektive des Lenkrechners der Lenkwaffe wiederholt sich die einmal gestartete Schleife bis zum Ende der Zeit.
Vielleicht würden Puristen
bevorzugen %Vor%Aber wie implementieren Sie dann die Methode blow2Bits? was würde es bedeuten, wenn blow2Bits wahr werden würde?
Ein Beispiel ist ein Nachrichtenpumpentyp-Szenario, in dem Sie für alle eingehenden Nachrichten eine Schleife erstellen möchten, bis die Nachricht beendet wird. Ein anderes ist, wenn Sie eine periodische Aktion ausführen möchten, dann könnten Sie eine Endlosschleife mit einem Schlaf darin schreiben (obwohl es besser sein könnte, eine Form von Timer dafür zu verwenden).
Es kann einige andere Stellen geben, an denen die Schleife eine bestimmte Menge an Arbeit ausführen muss, um zu bestimmen, ob sie beendet werden soll. Es ist möglicherweise sauberer, break
zu verwenden, wenn diese Bedingung wahr ist, anstatt einige externe Flags zu setzen Geben Sie an, dass die Schleife beendet werden soll.
Obwohl ich denke, dass es besser ist, wenn möglich, die exit-Bedingung in die loop-Anweisung zu setzen, anstatt sie unendlich zu machen und die Schleife mit einer break
-Anweisung zu verlassen, weil die Ausgangsbedingung der Schleife offensichtlicher ist.
Es gibt andere Fragen, die sich darauf beziehen, ob / wie es in Ordnung ist, break
in einer Schleife zu verwenden. Nehmen wir an, wir stimmen zu, dass es manchmal in Ordnung ist. Unter diesen Umständen (hoffentlich selten) würde ich eine Endlosschleife verwenden, wenn es eine Reihe von Beendigungsbedingungen und keine identifizierbare "primäre" Beendigungsbedingung gibt.
Sie vermeidet eine lange Reihe von Disjunktionen (und / oder) und macht den Leser auf die Tatsache aufmerksam, dass (wahrscheinlich) Unterbrechungen in der Schleife auftreten können.
Letztendlich ist es eine Frage des Geschmacks.
Ich benutze sie, um Linux-Daemons / Dienste zu schreiben, die so lange durchlaufen werden, bis Kill / andere Terminierungssignale empfangen werden.
Unendliche Schleifen sind vor allem in Daemon / Service-Prozessen oder der Hauptschleife in einem Spiel nützlich. Sie können sogar mit ihnen niedlich werden, zB:
%Vor%Sie sollten nicht verwendet werden, um auf Dinge wie Threads zu warten, wie von Fry . Sie können dafür die Join-Methode eines Thread-Objekts verwenden.
Wenn Sie jedoch in einer Situation sind, in der Ihr Tech-Lead sagt: "Endlos-Loops sind verboten, so gibt es mehrere Methoden- / Funktions-Returns und Breaks", können Sie auch so etwas tun:
%Vor%Natürlich, wenn Sie von einem technischen Leiter gezwungen werden, solche Dinge zu tun, sollten Sie anfangen, nach einem neuen Job zu suchen.
Weitere Informationen zum Schlüsselwort continue finden Sie in diesem MSDN -Artikel.
Webserver verwenden eine unendliche while-Schleife:
%Vor%Sie müssen nicht enden, wenn Sie Ihre Webserver-Anwendung nicht schließen.
Anders als bei eingebetteten Systemen sind Endlosschleifen immer wirklich:
%Vor%Aber manchmal ist Exit_Condition nicht etwas, was am Ende der Schleife tatsächlich ausgewertet werden kann. Man könnte immer ein Flag setzen, dieses Flag verwenden, um den Rest der Schleife zu überspringen und dann am Ende testen, aber das bedeutet, dass man es mindestens zweimal testet (der Code ist etwas langsamer) und persönlich finde ich es weniger klar / p>
Es gibt Zeiten, in denen Trading-Klarheit für Geschwindigkeit Sinn macht, aber etwas, das weder Klarheit noch Geschwindigkeit bietet, nur um technisch korrekt zu sein? Klingt für mich eine schlechte Idee. Jeder kompetente Programmierer weiß, dass while (true) bedeutet, dass die Abbruchbedingung irgendwo innerhalb der Schleife liegt.
Tags und Links c++ coding-style