2008-09-30 7 views

Antwort

80

Es ist nützlicher für Schleifen als if-Anweisungen.

while(var = GetNext()) 
{ 
    ...do something with var 
} 

die sonst

var = GetNext(); 
while(var) 
{ 
...do something 
var = GetNext(); 
} 
+8

Ich stimme zu - aber würde schreiben: while ((var = GetNext())! = 0) {...}, ohne zweimal darüber nachzudenken, zum Teil weil GCC sich beschwert, wenn ich nicht mit meinen Standard-Kompilierungsoptionen arbeite . –

+1

Wahr. Angenommen, Sie verwenden eine Sprache, die For-Loop-Deklarationen unterstützt, und Sie verwenden var nicht außerhalb der Schleife. – Gerald

+0

in einigen Sprachen, wie ANSI C, erlauben Scoping-Regeln diesen Ansatz nicht, @KerrekSB – wirrbel

22

Es kann nützlich sein, wenn Sie eine Funktion aufrufen, die sind entweder Daten zurück zu arbeiten oder eine Fahne um einen Fehler anzuzeigen (oder dass Sie sind fertig).

Etwas wie:

while ((c = getchar()) != EOF) { 
    // process the character 
} 

// end of file reached... 

persönlich ist es ein Idiom ich nicht sehr groß lieb bin, aber manchmal ist die Alternative hässliche.

28

Es ist nützlicher, wenn Sie eine Funktion aufrufen:

if (n = foo()) 
{ 
    /* foo returned a non-zero value, do something with the return value */ 
} else { 
    /* foo returned zero, do something else */ 
} 

Sicher, können Sie einfach die n setzen = foo(); auf eine separate Aussage dann, wenn (n), aber ich denke, das oben genannte ist ein ziemlich lesbares Idiom.

+0

ich glaube, Sie es in Klammern einschließen sollte oder wird gcc beschweren mit: Warnung: Klammern um Zuweisung als Wahrheitswert verwendet [-Wparentheses] So: if ((n = foo())) { // mache etwas mit dem Rückgabewert } else { // foo gab null/NULL zurück, mache etwas anderes } –

8

Das Idiom ist nützlicher, wenn Sie eine while Schleife statt einer if Anweisung schreiben. Für eine if-Anweisung können Sie sie wie beschrieben aufteilen. Aber ohne dieses Konstrukt, würden Sie entweder selbst wiederholen:

c = getchar(); 
while (c != EOF) { 
    // ... 
    c = getchar(); 
} 

oder verwenden Loop-and-a-half-Struktur:

while (true) { 
    c = getchar(); 
    if (c == EOF) break; 
    // ... 
} 

Ich würde in der Regel die Schleife-and-a- bevorzugen halbe Form.

8

GCC kann Ihnen helfen (mit -Wall) zu erkennen, wenn Sie versehentlich versuchen, einen Auftrag als Wahrheitswert zu verwenden, falls es Sie

if ((n = foo())) { 
    ... 
} 

schreiben empfiehlt D.h. verwendet zusätzliche Klammer, um anzuzeigen, dass dies wirklich das, was Sie wollen.

3

In PHP, zum Beispiel geschrieben werden müßte, ist es nützlich zum Durchschleifen SQL-Datenbank Ergebnisse:

while ($row = mysql_fetch_assoc($result)) { 
    // Display row 
} 

Das sieht viel besser als:

$row = mysql_fetch_assoc($result); 
while ($row) { 
    // Display row 
    $row = mysql_fetch_assoc($result); 
} 
+3

Dies hat auch die nette Nebenwirkung von $ row nicht über diese Schleife leben und daher für Garbage Collection früher (in Sprachen, die tun GC sowieso). –

23

Ich finde es sehr nützlich in Ketten von Handlungen, die oft Fehlererkennung beinhaltet, usw.

if ((rc = first_check(arg1, arg2)) != 0) 
{ 
    report error based on rc 
} 
else if ((rc = second_check(arg2, arg3)) != 0) 
{ 
    report error based on new rc 
} 
else if ((rc = third_check(arg3, arg4)) != 0) 
{ 
    report error based on new rc 
} 
else 
{ 
    do what you really wanted to do 
} 

Die Alternative (nicht die Zuordnung in der Bedingung verwendet wird) ist:

rc = first_check(arg1, arg2); 
if (rc != 0) 
{ 
    report error based on rc 
} 
else 
{ 
    rc = second_check(arg2, arg3); 
    if (rc != 0) 
    { 
     report error based on new rc 
    } 
    else 
    { 
     rc = third_check(arg3, arg4); 
     if (rc != 0) 
     { 
      report error based on new rc 
     } 
     else 
     { 
      do what you really wanted to do 
     } 
    } 
} 

Mit langwieriger Fehlerüberprüfung kann die Alternative, um die rechte Seite von der Seite, während der Zuweisung-in-bedingte Version ablaufen macht das nicht.

+0

Ja, ich tat genau das, um übermäßige Verschachtelung zu vermeiden, und suchte dann online, um zu sehen, ob es eine übliche Praxis war. Am Ende habe ich mich dagegen entschieden, weil ich eigentlich nur einen anderen Fall hatte, aber das scheint ein legitimer Grund zu sein, den Auftrag in den Zustand zu bringen. – Ibrahim

+0

Kollegen hassen es! Für mich ist es zumindest in den meisten Fällen viel aufrechterhaltbar als ein riesiger Baum oder viele Erträge. Ich bevorzuge Single Return von einer Funktion ... – Nathan

3

Die kurze Antwort ist, dass Expression-oriented Programmiersprachen mehr prägnanten Code erlauben. Das zwingen Sie nicht zu separate commands from queries.

+0

Es ist ein ständiger Kampf, um Codierung ohne Zuweisungen in If(), while() und andere ähnliche Aussagen zu erzwingen. C/C++ ist berüchtigt für Nebenwirkungen von solchen, die sich oft als Fehler herausstellen, besonders wenn wir die ++ und - Operatoren hinzufügen. –

2

Der andere Vorteil kommt während der Verwendung von gdb. Im folgenden Code ist der Fehlercode nicht bekannt, wenn wir auf Einzelschritt waren.

while (checkstatus() != -1) { 
    // process 
} 

Eher

while (true) { 
    int error = checkstatus(); 
    if (error != -1) 
     // process 
    else 
     //fail 
} 

Jetzt während Schritt können wir wissen, was die Rückkehr Fehlercode aus dem check (war).

-2

Der Grund dafür ist:

  1. Leistungsverbesserung (manchmal)

  2. Lesser-Code (Immer)

ein Beispiel: Es gibt eine Methode someMethod() und in eine if Bedingung, die Sie überprüfen möchten, ob der Rückgabewert der Methode null ist. Wenn nicht, werden Sie den Rückgabewert erneut verwenden.

If(null != someMethod()){ 
    String s = someMethod(); 
    ...... 
    //Use s 
} 

Es wird die Leistung beeinträchtigen, da Sie die gleiche Methode zweimal aufrufen. Stattdessen verwenden:

String s; 
If(null != (s = someMethod())) { 
    ...... 
    //Use s 
}