Im Geiste von Fragen wie Testen Sie Ihre Schleifen bei oben oder unten? :
Welchen Stil verwenden Sie für eine unendliche Schleife und warum?
Es scheint die Bedeutung der Schleife am effektivsten zu vermitteln.
Ich bevorzuge while(1)
oder while(true)
- es ist am klarsten. do { } while(true)
scheint wie unnötige Verschleierung. Ebenso kann for(;;)
für Leute, die es noch nie zuvor gesehen haben, verwirrend sein, während while(true)
sehr intuitiv ist. Und es gibt absolut keinen Grund, label: ... goto label;
zu machen, es ist nur verwirrender.
Normalerweise verwende ich for(;;) { }
, was ich immer für "für immer" halte.
Einige Sprachen bieten ein repeat { }
-Konstrukt an, das für immer nativ endlos läuft. Ich finde das for(;;) { }
-Konstrukt visuell am ähnlichsten, weil es sich so sehr von dem normalen for()
-Konstrukt unterscheidet. Dies ist ein wichtiges Attribut für eine Endlosschleife, die while(1) { }
nicht wirklich hat.
Wenn ich Code für mich selbst schreibe, benutze ich für (;;). Andere Leute neigen dazu, durch ihre Syntax verwirrt zu sein und so für Code, den andere Leute sehen / benutzen müssen, verwende ich while (true).
offtopic: Wenn Sie darüber nachdenken, was Sie ausdrücken möchten, brauchen Sie normalerweise keine Endlosschleife.
Lass die Flammen anfangen ...
Wenn die Schleife eine true Endlosschleife ist (dh es gibt keine Unterbrechungsbedingung - nur ein externes Ereignis kann die Ausführung des Threads / process beenden), dann bevorzuge ich die Bezeichnung und goto
. Hier ist warum:
Erstens impliziert die Verwendung von while
, for
und do ... while
, dass die Schleife möglicherweise beendet wird. Selbst wenn die Beendigungsbedingung nie erreichbar ist, ist die syntaktische Bedeutung dieser Konstrukte, dass eine Beendigungsbedingung ist.
Zweitens führt die Verwendung eines Schleifenkonstrukts zu einer zusätzlichen Einrückungsebene. Ich hasse Einrückung, die nicht notwendig ist. Es verschwendet wertvolle kolumnare Immobilien.
Drittens ist die einzige wahre Endlosschleife diejenige, die unbedingt zum Anfang der Schleife zurückspringt. Nur goto
passt genau zu diesem Zweck.
Die Wahrheit ist, dass es mir nicht wirklich wichtig ist. Sie alle erledigen den Job, und die meisten werden sowieso genau die gleiche Montageanleitung ergeben. Allerdings wird die generierte Assembly höchstwahrscheinlich ein unbedingter Sprung sein (wenn Sie Optimierer sind, ist es einen verdammten Wert), der direkt auf welches C-Konstrukt, Kinder, abbildet? Das ist richtig ... dein alter Freund goto
.
Unendliche Schleifen sind eine schlechte Idee, aber in der Praxis hält das nicht immer stand.
Ich bevorzuge while (1) {}, aber stelle sicher, dass etwas in der Schleife dazu führt, dass es ausbricht.
Normalerweise verwende ich while() {}
, aber nachdem ich gelernt habe, dass for(;;) {}
keine verrückte Syntax ist, werde ich sicher sein, die etwas andere Option zu verwenden.
Unterscheidet Endlosschleifen von tatsächlichen Bedingungen, sehen Sie.
Ich bevorzuge jetzt das " for (;;)
" - Idiom, weil es mehr "hervorsteht". Früher habe ich das " while (true)
" -Idiom verwendet, weil ich dachte, dass es die Absicht besser ausdrückt, aber ich bin umgetauscht, weil ich denke, dass das " for (;;)
" -Idiom hinreichend bekannt ist, um die Absicht angemessen auszudrücken durch mehr sichtbar sein.
So wie Stroustrup die neuen Umwandlungen in C ++ absichtlich hässlich gemacht hat - also stehen sie heraus.
Tags und Links c c++ coding-style