Welche ist die bevorzugte Bedingung in der Schleife?

7
%Vor%

Welche ist bevorzugt?

  

Dies war ein Beispiel aus "Accelerated C ++"   : praktische Programmierung am Beispiel /   Andrew Koenig, Barbara E. Moo. "Nur   wollte wissen, warum der Autor es vorzieht   der erste

    
yesraaj 25.01.2009, 10:14
quelle

12 Antworten

14

Der zweite. Aus zwei Gründen

  1. 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.

  2. 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.

    
Cruachan 25.01.2009, 10:22
quelle
3

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.

    
Paul Dixon 25.01.2009 10:18
quelle
3

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.

    
Evan Fosmark 25.01.2009 10:23
quelle
2

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.

    
user25148 25.01.2009 10:25
quelle
1

Normalerweise mache ich den zweiten Weg mit & lt ;. Aber die Verwendung von! = Seit stl Iteratoren in C ++ funktioniert auf diese Weise.

    
yesraaj 25.01.2009 10:23
quelle
1

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.

    
Matthew Scharley 25.01.2009 10:24
quelle
1

<n ist das am häufigsten verwendete (meiner Meinung nach)

    
karlis 25.01.2009 10:16
quelle
1

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.

    
Jj. 25.01.2009 10:55
quelle
0

Ich kann nicht sehen, dass es wichtig ist, gibt es nicht wichtigere Dinge, über die man sich Sorgen machen muss?

Ich benutze immer Letzteres, und das habe ich am meisten gesehen.

Jemand ist sicher, mich darüber zu erschießen, obwohl ....

    
benlumley 25.01.2009 10:16
quelle
0

"i & lt; n" ist besser. Wenn Sie "i! = N" verwenden und in einigen Fällen Ihr ursprüngliches i größer als n ist, werden Sie eine Endlosschleife eingeben.

    
Igor Oks 25.01.2009 10:35
quelle
0

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.

    
Ionut Anghelcovici 25.01.2009 10:38
quelle
0

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önnen
  

Schleife, 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 ) ).

    
Johannes Schaub - litb 25.01.2009 17:34
quelle

Tags und Links