Ich habe also einen C ++ - Code für Back-Tracking-Knoten in einem BFS-Algorithmus. Es sieht ein bisschen so aus:
%Vor% Aber das while (true)
scheint ... verdächtig für mich. Ich weiß, dass dieser Code funktioniert und logischerweise weiß ich, dass es funktionieren sollte. Allerdings kann ich das Gefühl nicht loswerden, dass es eine Bedingung in while
geben sollte, aber die einzig mögliche ist, eine bool
Variable zu verwenden, nur um zu sagen, ob es fertig ist. Sollte ich aufhören, mir Sorgen zu machen? Oder ist das wirklich schlechte Form.
BEARBEITEN : Danke an alle, dass ihr bemerkt habt, dass es einen Weg gibt, um dies zu umgehen. Ich würde jedoch gerne wissen, ob es andere gültige Fälle gibt.
Ich glaube, dass es Fälle gibt, in denen scheinbar unendliche Schleifen existieren. Dies scheint jedoch keiner von ihnen zu sein. Es scheint, als könnten Sie den Code genauso einfach wie folgt schreiben:
%Vor%Dies scheint die wahre Absicht der Schleife besser auszudrücken
Mein zwei Cent ist: Code sollte selbstdokumentieren sein. Das heißt, wenn ich ein Stück Code bekomme, würde ich lieber in der Lage sein, die Absicht des Programmierers zu sehen und zu sagen, dann Kommentare lesen oder durch den umgebenden Code stapfen zu müssen. Wenn ich lese:
%Vor%Das sagt mir, dass der Programmierer eine Endlosschleife wollte; dass die Endbedingung nicht angegeben werden konnte. Dies ist die Absicht des Programmierers unter bestimmten Umständen; eine Serverschleife zum Beispiel, und das ist, wenn es verwendet werden sollte.
Im obigen Code ist die Schleife nicht für immer gedacht, sie hat eine eindeutige Endebedingung und um semantisch klar zu sein, wie andere gezeigt haben:
%Vor%funktioniert, also ist die while (true) deutlich unterlegen und sollte in diesem Fall vermieden werden.
Es gibt Zeiten und Orte für unendliche Schleifen - ich bin nicht davon überzeugt, dass dies einer von ihnen ist. Auf der anderen Seite ist es bei weitem kein großes Problem.
%Vor%Ein Platz, um sie zu verwenden, ist, wenn der Prozess wirklich unbestimmt ist - ein Daemon-Prozess mit einer Monitor-Schleife, die nicht beendet wird.
Ich stimme den anderen Antworten zu, dass in diesem Fall keine Endlosschleife erforderlich ist.
Ein weiterer Punkt könnte jedoch sein, dass for(;;)
eine bessere Endlosschleife ist, wenn Sie > eine Endlosschleife verwenden. Einige Compiler generieren Warnungen für while(true)
(Bedingung wird immer zu false ausgewertet), und Ihre Absicht ist weniger klar, da sie wie jede andere Schleife aussieht. Vielleicht hieß es while (x == true)
, und Sie haben versehentlich x
anstelle von true
entfernt. for(;;)
sagt ziemlich klar, dass dies eine Endlosschleife sein soll. Oder vielleicht beabsichtigten Sie, etwas wie while(t)
zu schreiben, aber Intellisense in Ihrer IDE trat ein und entschied sich für die automatische Vervollständigung in true
.
for(;;)
andererseits ist nichts, was Sie versehentlich eingeben würden. (und es ist einfacher zu suchen. while (true) könnte auch als while (1) geschrieben werden)
Keine Version ist falsch , aber for(;;)
könnte intuitiver sein, weil keine Schleifenbedingung ist.
while(true)
wird in Spielen für die Hauptspielschleife verwendet - Spiele lesen fortlaufend Spielereingaben, verarbeiten Interaktionen zwischen Objekten und malen Ihren Bildschirm und wiederholen dann. Diese Schleife wird unendlich fortgesetzt, bis eine andere Aktion aus dieser Schleife ausbricht (Beenden des Spiels, Beenden des Levels).
Ich habe versucht, diese Hauptschleife im Quake 1-Quellcode schnell für dich zu finden, aber es gab mindestens 50 Vorkommen von ' while(1)
', sowie einige, die als ' for(;;)
' geschrieben wurden, und ich war nicht ' t sofort sicher, welches die Hauptspielschleife war.
Obwohl ich sie schon einmal gemacht habe, würde ich dafür stimmen, dass ich immer die klarere Lösung suche, indem ich etwas Lesbares verwende, das normalerweise einen gültigen Ausdruck in der while-Schleife enthält - ansonsten scannen Sie den Code für die Pause.
Ich habe nicht wirklich Angst vor ihnen oder so, aber ich weiß, dass einige Leute sind.
Hör auf dich zu sorgen. Dies ist keine schlechte Form, wenn es hilft, die Logik des Codes zu vereinfachen und Wartbarkeit und Lesbarkeit zu verbessern. Es lohnt sich jedoch, Kommentare zu den erwarteten Austrittsbedingungen und darüber, warum der Algorithmus nicht in eine Endlosschleife schlüpft, zu dokumentieren.
Nun, ja , aber die zwei Codeseiten, die Sie schreiben müssen, wenn Sie nicht wollen, dass Ihre Hauptschleife etwas wie while(true)
ist, ist sogar schlechter form.
Tags und Links language-agnostic c++ coding-style infinite-loop