Sind Endlosschleifen in schlechter Form?

7

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.

    
rlbond 02.06.2009, 23:31
quelle

12 Antworten

22

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

    
JaredPar 02.06.2009, 23:36
quelle
13

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.

    
Todd Gardner 03.06.2009 00:00
quelle
6

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.

    
Jonathan Leffler 02.06.2009 23:36
quelle
5

Es gibt Situationen, in denen ein Konstrukt wie dieses sinnvoll ist:

  1. Die Abbruchbedingung wird innerhalb der Schleife
  2. berechnet
  3. Es gibt mehr Unterbrechungsbedingungen und sie sind alle gleich wichtig
  4. Sie wollen wirklich eine endlose Schleife;) ..
beef2k 02.06.2009 23:39
quelle
5

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.

    
jalf 03.06.2009 00:27
quelle
4

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.

    
too much php 03.06.2009 00:10
quelle
1

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.

    
Bill K 02.06.2009 23:57
quelle
0

Nun, ein Kommentar, der sagt, dass es nicht wirklich eine Endlosschleife ist, würde helfen:

%Vor%

Ich stimme zu, dass es eine Bedingung haben sollte, aber das ist in einigen Situationen okay (und es ist nicht immer möglich oder einfach, eine Bedingung zu stellen).

    
Zifre 02.06.2009 23:33
quelle
0

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.

    
Stephen Doyle 02.06.2009 23:40
quelle
0

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.

    
Electrons_Ahoy 02.06.2009 23:44
quelle
0

Es ist nicht ungewöhnlich, Endlosschleifen im Code eingebetteter Systeme zu finden, die oft endliche Automaten umgeben, periphere Chips und Geräte überprüfen usw.

    
Demi 03.06.2009 00:33
quelle
0

Ich liebe unendliche Schleifen als äußere Kontrollstruktur einer endlichen Zustandsmaschine. Es ist effektiv ein strukturiertes goto:

%Vor%

}

    
plinth 01.09.2009 17:54
quelle