2016-05-21 4 views
2

Sollte ich for oder while-Schleife für die Suche nach dem letzten Element in der verknüpften Liste verwenden?For vs Während zum Finden des letzten Artikels in der verknüpften Liste

Item * last = list; 
for (; last->next; last = last->next) ; 

gegen

Item * last = list; 
while (last->next) 
{ 
    last = last->next; 
} 

ist es 2 Zeilen gegenüber 5 und es scheint fast ebenso lesbar. Warum sehe ich immer nur die while Form?

+0

Die for-Schleife legt normalerweise nahe, dass die Schleifenvariable ein privates, lokales Detail der Schleife ist. Wenn der Punkt der Schleife irgendeine * andere * externe Variable ändern soll, dann ist die 'while' Version in dieser Hinsicht ein wenig klarer. Insbesondere, wenn der Inkrementteil der for-Schleife den externen Zustand ändert, ist dies möglicherweise schwer zu erkennen und zu verwirren. –

+0

Ich glaube, dass beide in Erinnerung und Zeit gleich sind. –

+0

Es ist so ziemlich eine persönliche Vorliebe .. – Shury

Antwort

2

Wenn Sie die Zeilenanzahl vergleichen möchten, versuchen Sie es zumindest einigermaßen genau. Die for Schleife soll wie folgt formatiert werden:

Item * last = list; 
for (; last->next; last = last->next) 
    ; 

Dies macht es viel mehr offensichtlich, dass die for Schleife (absichtlich) ist eine leere Anweisung zu steuern.Die while Schleife kann wie folgt geschrieben mehr werden:

Item * last = list; 
while (last->next) 
    last = last->next; 

Wenn wir darauf bestehen, dass wir Klammern um auch nur eine einzige kontrollierte Erklärung benötigen, sie am Ende noch mit der gleichen Zeilenzahl für jeweils bis:

Item * last = list; 
for (; last->next; last = last->next) { 
    ; 
} 

vs:

Item * last = list; 
while (last->next) { 
    last = last->next; 
} 

der Unterschied in der Zeilenzahl also aufgrund war ausschließlich auf die Formatierung, die Sie zu verwenden, entschied sich (und insbesondere die Tatsache, dass Sie nicht die gleiche oder sogar benutzt haben ähnliche Formatierung für die beiden).

Andere haben bereits darauf hingewiesen, dass diese wahrscheinlich zu identischen Code kompilieren, und ich stimme zu, dass Sie dies mit einem vernünftigen Compiler erwarten können (und sollten).

Das lässt Stil und Lesbarkeit als die einzige Differenzierung. In dieser Hinsicht ist die for Schleife klar vorzuziehen. Einige Leute, die sich anscheinend nie von einer frühen Exposition gegenüber BASIC (oder möglicherweise FORTRAN) erholt haben, bestehen darauf, dass for-Schleifen nur für einfache gezählte Schleifen verwendet werden sollten, wie sie in BASIC und FORTRAN unterstützt werden. Diese Beschränkung auf C oder C++ anzuwenden, ist einfach falsch und albern. C's for Loop wurde aus einem guten Grund viel vielseitiger gemacht, und rein künstliche Grenzen zu setzen, tut niemandem etwas.

einfache Daumenregel: Wenn Sie tatsächlich mindestens zwei der drei Klauseln in den Header for Schleife des verwenden, ist es besser, eine for Schleife als eine while Schleife zu verwenden. Eine Schleife mit einem leeren Körper ähnelt in etwa einem Konstruktor mit einem leeren Körper: Es mag für Leute, die die Sprache nicht kennen, ungewohnt und verwirrend sein, aber für jeden, der die Sprache wirklich kennt, ist sie trivial und so vertraut wie die Finger auf ihrer Hand.

4

Die beiden Schleifen sind logisch äquivalent, und höchstwahrscheinlich wird am Ende zu identischen Code kompiliert zu werden.

Verwenden Sie das, das Sie mögen.

1

Da die verwendet, wenn Sie wissen, wie viele Schritte, die Sie machen werden. Außerdem kann diese Schleife ihre Variablen privat haben (den Iterator).

Die wird verwendet, bis eine Bedingung erfüllt ist. Sie können alle Schleifen mit dieser Schleife simulieren.

Wie man jedoch leicht sehen kann, können beide verwendet werden, da sie gleichwertig sind.

5

Warum ich immer nur die während Form sehen?

Es gibt zwei Gründe, warum die while Form bevorzugt:

  • Loops mit leeren Körper sind nicht so lesbar wie Schleifen, die zumindest eine Aussage in ihrem Körper haben - Programmierer neu in C finden das Semikolon nach der for Schleife verwirrend, oder sogar das Semikolon überhaupt vermissen, nicht verstehen, was vor sich geht. Es gibt keine solche Verwirrung über die while Schleife.
  • for Loops mit Loop-Variable außerhalb der Schleife deklariert bieten eine starke Indikation, dass Sie tatsächlich wollen while Schleife - Loop-Variablen sind auf den Körper der Schleife beschränkt. Wenn Sie sie außerhalb der Schleife deklarieren, liegt das daran, dass Sie den Endwert der Schleifenvariablen unter den Ergebnissen Ihrer Schleife haben möchten.
+0

Ich weiß nicht über diesen zweiten Punkt. Wenn Ihre Schleife ein "continue" hat, benötigen Sie möglicherweise noch die Iterationsgarantie, die das 'for' liefert. – Barry

Verwandte Themen