it-swarm.com.de

Warum würden Sie eine Aufgabe in einer Bedingung verwenden?

In vielen Sprachen sind Aufträge unter bestimmten Bedingungen zulässig. Ich habe den Grund dafür nie verstanden. Warum schreiben Sie:

if (var1 = var2) {
  ...
}

anstatt von:

var1 = var2;
if (var1) {
  ...
}
67
lajos

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

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

Was sonst noch geschrieben werden müsste

var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}
100
Gerald

Ich finde es am nützlichsten in Aktionsketten, bei denen es häufig um Fehlererkennung usw. geht.

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 (ohne die Zuordnung in der Bedingung zu verwenden) 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
        }
    }
}

Bei einer langwierigen Fehlerprüfung kann die Alternative von der rechten Seite der Seite abweichen, wohingegen dies in der Version mit Zuweisung unter bestimmten Bedingungen nicht der Fall ist.

Die Fehlerprüfungen können natürlich auch "Aktionen" sein - first_action(), second_action(), third_action() - und nicht nur Überprüfungen. Das heißt, sie können Schritte in dem von der Funktion verwalteten Prozess überprüft werden. (In dem Code, mit dem ich arbeite, entsprechen die Funktionen in der Regel den Vorgaben für die Prüfung oder den Speicherzuweisungen, die für die Funktion erforderlich sind, oder ähnlichen Vorgaben.).

30

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 */
}

Klar, du kannst einfach n = foo () setzen; auf einer separaten Aussage dann wenn (n), aber ich denke, das oben ist eine ziemlich lesbare Redewendung.

29
Chris Young

Dies kann nützlich sein, wenn Sie eine Funktion aufrufen, die entweder zu bearbeitende Daten zurückgibt, oder ein Flag, das auf einen Fehler hinweist (oder wenn Sie fertig sind).

Etwas wie:

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

// end of file reached...

Persönlich ist es eine Redewendung, die ich nicht besonders mag, aber manchmal ist die Alternative hässlicher.

23
Michael Burr

GCC kann Ihnen dabei helfen (mit -Wall) festzustellen, ob Sie versehentlich versuchen, eine Zuweisung als Wahrheitswert zu verwenden, falls es empfiehlt, dass Sie schreiben

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

Das heißt Verwenden Sie zusätzliche Klammern, um anzugeben, dass dies wirklich das ist, was Sie wollen.

10
JesperE

Die Redewendung ist nützlicher, wenn Sie eine while -Schleife anstelle einer if -Anweisung schreiben. Bei einer if -Anweisung können Sie sie wie beschrieben aufteilen. Aber ohne dieses Konstrukt müssten Sie sich entweder wiederholen:

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

oder verwende eine Struktur mit anderthalb Schleifen:

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

Normalerweise bevorzuge ich die Form mit anderthalb Schlingen.

8
Greg Hewgill

Die kurze Antwort lautet: Ausdrucksorientiert Programmiersprachen ermöglichen prägnanteren Code. Sie zwingen Sie nicht zu trennen Sie Befehle von Abfragen .

4
Hugh Allen

In PHP ist es beispielsweise nützlich, um SQL-Datenbankergebnisse zu durchlaufen:

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

Das sieht viel besser aus als:

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

Der andere Vorteil kommt bei der Verwendung von GDB. Im folgenden Code ist der Fehlercode nicht bekannt, wenn es sich um einen einzelnen Schritt handelt.

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

Lieber

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

Jetzt können wir während eines einzelnen Schritts anhand von checkstatus () den Rückkehrfehlercode ermitteln.

2
plasmixs