Zurück in meinen C / C ++ Tagen, Codierung einer "Endlosschleife" als
while (true)
fühlte sich natürlicher an und schien mir offensichtlicher als im Gegensatz zu
for (;;)
Eine Begegnung mit PC-Flusen in den späten 1980er Jahren und anschließende Best-Practice-Diskussionen haben mich von dieser Gewohnheit befreit. Ich habe seitdem die Schleifen mit der for
Steueranweisung codiert . Heute, zum ersten Mal seit langer Zeit und vielleicht als erster Bedarf an einer Endlosschleife als C # -Entwickler, stehe ich vor der gleichen Situation. Ist einer von ihnen richtig und der andere nicht?
c#
infinite-loop
Bob Kaufman
quelle
quelle
while(true)
erfordert eine Bedingung.for(;;)
ist daher eine bessere Darstellung für Endlosschleifen, die sich bedingungslos wiederholen. 2. Alte, nicht optimierende Compiler haben möglicherweise tatsächlich die(true)
Schleife ausgewertet . 3. C ist eine minimalistische Sprache aus der Zeit der Teletypen, 300 Baud-Terminals und 1-Zeichen-Variablennamen. In einer Umgebung, in der jeder Tastendruck zählt,for(;;)
ist er viel kürzer alswhile(true)
.Antworten:
Ist immer das, was ich verwendet habe und was andere für eine Schleife verwendet haben, die manuell unterbrochen werden muss.
quelle
Der C # -Compiler transformiert beide
und
in
Die CIL ist für beide gleich. Die meisten Menschen finden
while(true)
es leichter zu lesen und zu verstehen.for(;;)
ist eher kryptisch.Quelle:
Ich habe ein bisschen mehr mit .NET Reflector rumgespielt und beide Schleifen mit dem "Code optimieren" in Visual Studio kompiliert.
Beide Schleifen werden kompiliert (mit .NET Reflector):
Raptoren sollten bald angreifen.
quelle
goto
übrigens identisch mit einer Aussage, was keine Überraschung ist.goto LOOP
ist die richtige C # Endlosschleife :)Ich denke, dass dies leichter zu lesen ist und definitiv der Standard für die Verwendung in C # ist:
quelle
while(1)
ist in C # nicht gültig, da1
es nicht a istbool
.Keuchen, benutzen:
ODER wie jsight hervorhob , möchten Sie vielleicht doppelt sicher sein:
Bevor die Leute mich anschreien, ist es alles der gleiche CIL-Code, den ich überprüft habe :)
quelle
Um ein paar alte Witze aufzuwärmen:
for (;;) {}
" - es bringt die Aussage zum Weinen.#define EVER ;;
".quelle
#define ever (;;)
was ich für lesbarer halte.for ever {}
#define forever while(true)
;)Wenn Sie auf die alte Schule gehen möchten, wird goto in C # weiterhin unterstützt:
Für eine wirklich Endlosschleife ist dies der Befehl go-to. =)
quelle
Ich finde
while (true)
es etwas lesbarer.quelle
In solchen Situationen, in denen ich eine echte Endlosschleife brauchte, habe ich immer verwendet
Es scheint die Absicht besser auszudrücken als eine leere Aussage.
quelle
Persönlich habe ich es immer vorgezogen,
for(;;)
gerade weil es keine Bedingung hat (im Gegensatz zuwhile (true)
der, die immer wahr ist). Dies ist jedoch wirklich ein sehr kleiner Stilpunkt, über den ich meiner Meinung nach nicht streiten sollte. Ich habe noch keine C # -Stilrichtlinie gesehen, die einen der beiden Ansätze vorgeschrieben oder verboten hat.quelle
while
" verstehen . Für den Programmierer wandelt der Compiler High-Level-Code in IL um. Es gibt keinewhile
(oderfor
) Schleifen in IL, nur Labels und Gotos.Ich persönlich bevorzuge die
for (;;)
Redewendung (aus C / C ++ - Sicht). Ich stimme zwar zu, dass daswhile (true)
in gewissem Sinne besser lesbar ist (und es ist das, was ich vor langer Zeit verwendet habe, selbst in C / C ++), aber ich habe mich der Verwendung derfor
Redewendung zugewandt, weil:Ich denke, die Tatsache, dass eine Schleife nicht endet (auf normale Weise), ist es wert, "herausgerufen" zu werden, und ich denke, dass das
for (;;)
ein bisschen mehr tut.quelle
for
nachwhile
. Für beidefor (;;){}
undwhile (true){}
generiert es neuenwhile(true){}
Code. Siehe diese Antwort .Das ursprüngliche K & R- Buch für C, aus dem C # seine Herkunft ableiten kann, wird empfohlen
für Endlosschleifen. Es ist eindeutig, leicht zu lesen und hat eine lange und edle Geschichte.
Nachtrag (Februar 2017)
Wenn Sie der Meinung sind, dass dieses Schleifenformular (oder ein anderes Formular) zu kryptisch ist, können Sie natürlich immer nur einen Kommentar hinzufügen .
Oder:
quelle
Es sollte
while(true)
nicht seinwhile(1)
,while(1)
ist also in C # falsch, ja;)quelle
Alternativ könnte man sagen, dass eine Endlosschleife normalerweise sowieso eine schlechte Praxis ist, da sie eine Exit-Bedingung benötigt, es sei denn, die App läuft wirklich für immer. Wenn dies jedoch für eine Marschflugkörper gilt, akzeptiere ich, dass eine explizite Ausstiegsbedingung möglicherweise nicht erforderlich ist.
Obwohl ich diesen mag:
quelle
f < 16777217f
ist immerfalse
... also wird dies nie wiederholt.Ich bevorzuge etwas mehr "gebildeten" Code. Ich mache so etwas in der Praxis viel eher:
quelle
do ... while()
verschleierte Schleife. Ich habe nur ein paar Sekunden gebraucht, um das zu sehen. Wenn Sie einedo ... while()
Schleife geschrieben hätten, wäre dies sofort klar gewesen. -1break
.Sogar ich sage auch, dass das folgende besser ist :)
quelle
Wenn Sie Code-Golf spielen, würde ich vorschlagen
for(;;)
. Darüber hinauswhile(true)
hat die gleiche Bedeutung und scheint intuitiver. Auf jeden Fall werden die meisten Programmierer wahrscheinlich beide Variationen verstehen, also spielt es keine Rolle. Verwenden Sie das, was am bequemsten ist.quelle
Der einzige Grund, den ich sagen würde,
for(;;)
sind die CodeDom-Einschränkungen (während Schleifen nicht mit CodeDom deklariert werden können und for-Schleifen als allgemeinere Form als Iterationsschleife angesehen werden).Dies ist ein ziemlich loser Grund, dies anders zu wählen als die Tatsache, dass die
for
Schleifenimplementierung sowohl für normalen Code als auch für von CodeDom generierten Code verwendet werden kann. Das heißt, es kann mehr Standard sein.Als Hinweis können Sie Code-Snippets verwenden, um eine
while
Schleife zu erstellen , aber die gesamte Schleife müsste ein Snippet sein ...quelle
Beide haben die gleiche Funktion, aber die Leute bevorzugen im Allgemeinen
while(true)
. Es fühlt sich leicht zu lesen und zu verstehen ...quelle
Jeder Ausdruck, der immer true zurückgibt, sollte für die while-Schleife in Ordnung sein.
Beispiel:
quelle
In Bezug auf die Lesbarkeit des Codes
while(true)
in jeder Sprache ist dies meiner Meinung nach sinnvoller. In Bezug darauf, wie der Computer es sieht, sollte es in der heutigen Gesellschaft wirklich keinen Unterschied zwischen sehr effizienten Compilern und Interpreten geben.Wenn es Leistungsunterschiede gibt, wird die Übersetzung in MSIL sicher nicht mehr optimiert. Sie könnten das überprüfen, wenn Sie wirklich wollten.
quelle