Der zweite. Aus zwei Gründen
Das weniger als (oder manchmal & lt; =) ist die übliche Art, wie die meisten Programmierer diese schreiben, und es ist besser, wenn möglich nach Konvention zu bleiben - das! = wird wahrscheinlich die meisten Programmierer dazu bringen, zweimal zu gucken, ob es da ist etwas seltsam in der Schleife, während die & lt; wird sofort verstanden werden.
Das! = hängt von einer genauen Bedingung ab. Wenn das Innere der Schleife während der Wartung geändert wird und ich versehentlich innerhalb der Schleife inkrementiert habe, dann würden Sie mit einer Endlosschleife enden. Im Allgemeinen ist es immer besser, die Abbruchbedingung so weit wie möglich zu machen - es ist einfach robuster.
2 ist natürlich der Grund, warum 1.
Ich würde sagen <
, da es eine größere Anzahl von Bedingungen erfasst. Angenommen, n war nicht konstant, sondern kehrte von einer Funktion zurück, die in seltenen Fällen -1 zurückgab. In diesem Fall hätten Sie eine viel längere Schleife (bis der Int-Wert auf einen -ve-Wert springt!) Mit der! = - Version der Schleife.
Die Verwendung von condition <
ist viel besser, weil es die Möglichkeit verringert, über Ihren Sentinel-Wert zu treten und in eine Endlosschleife zu fallen.
Wie in der Frage angegeben, sind beide Schleifen äquivalent. In echtem Code ist es jedoch typisch, dass die Dinge ein bisschen komplizierter sind, und in diesem Fall ist der Zustand "i & lt; n" tendenziell ein klein wenig sicherer. Wenn ich zum Beispiel um mehr als eins zunehmen würde, könnte es über n hinausgehen und dann würde die "i! = N" Version zu einer ewigen Schleife führen.
Dies ist ein Fall von defensiver Programmierung. Es ist nicht allgemein akzeptiert: Manche Leute bevorzugen es, sicherzustellen, dass die Dinge so spektakulär wie möglich ausfallen, so dass Fehler früh gefunden werden. Der defensive Stil kann kleine Probleme wie diese verbergen. Wenn Sie jedoch alle Fehler abfangen möchten, können Sie auch den ganzen Weg gehen:
%Vor%(Oder, noch besser, verwenden Sie eine Sprache, die synxtax unterstützt, um Vor- und Nachbedingungen und Schleifeninvarianten nativ anzugeben.)
Das Buch "C Traps and Pitfalls" von Andrew Koenig (siehe Ссылка ) für Anfänger) ist wahrscheinlich interessant für Sie, wenn Sie über diese Art von Frage nachdenken möchten.
Der zweite. Es wird immer irgendwann fertig sein (vorausgesetzt, Sie tun nichts Lustiges, als mit dem Wert des Zählers innerhalb der Schleife zu spielen).
Ich habe nie das erste Mal gesehen, zumindest nicht auf diese Art.
Ich würde es vorziehen, & lt; , denn wenn man sich nur den Code anschaut, kann man sagen, dass es eine zunehmende Schleife ist, es sichert die Tatsache, dass man i ++ benutzt.
Wenn Sie i ++ und & lt; und aus irgendeinem Grund (anderer Coder, Tippfehler, menschlicher Fehler) ändert dein Code das Inkrement zu i-- du würdest sofort wissen, dass die Schleife nicht evaluiert wird, wie mit! = es wird funktionieren, so dass es nicht so trivial ist debuggen.
Ich glaube, das ist eine bessere Alternative, wenn Sie für optimieren Geschwindigkeit:
%Vor%Der Grund dafür ist, dass der Vergleich mit 0 schneller ist.
Ich sage, es hängt vom Typ der Iteratorvariablen ab. Wenn Sie wissen, dass es eine Ganzzahl ist, würde ich die zweite verwenden, weil Sie
sagen könnenSchleife, solange ich kleiner als n
bin
Was ich denke, ist für die meisten Programmierer, einschließlich mir selbst, einfacher zu lesen. Wenn Sie den Typ der Iteratorvariablen nicht kennen, sollten Sie so wenig wie möglich Annahmen über seine Fähigkeiten machen. Die operator<
ist möglicherweise nicht für i
verfügbar: Wenn es sich um einen anderen Iterator als einen Direktzugriffsiterator handelt, ist operator<
nicht garantiert verfügbar. In diesem Fall würde ich operator!=
verwenden.
Ich würde vermeiden, die Option <
zu bevorzugen, nur weil Sie versehentlich den Endwert "übergehen" könnten. Ich denke, das Argument ist fehlerhaft. Denn wenn du aus Versehen übergehst hast, dann ist das ein Fehler und es sollte so schnell wie möglich bemerkt werden ( Fail-fast ) ).