Frage

Was ist der folgende Code zu tun in C / C ++?

if (blah(), 5) {
    //do something
}
War es hilfreich?

Lösung

Comma Operator angewendet wird, und der Wert 5 verwendet wird, um die Bedingung des true / false zu bestimmen.

Es wird blah () ausführen und etwas zurück (vermutlich) bekommen, dann wird der Komma-Operator verwendet und 5 wird das einzige sein, das verwendet wird, um den Wahr / Falsch-Wert für den Ausdruck zu bestimmen.


Beachten Sie, dass der Operator für den Rückgabetyp der blah () Funktion überlastet werden könnte (was nicht angegeben wurde), so dass das Ergebnis nicht offensichtlich.

Andere Tipps

Wenn der Komma-Operator nicht überlastet ist, wird der Code ist ähnlich wie folgt aus:

blah();
if (5) {
  // do something
}

Wenn der Komma-Operator überlastet ist, wird das Ergebnis auf dieser Funktion basieren.

#include <iostream>
#include <string>

using namespace std;

string blah()
{
    return "blah";
}

bool operator,(const string& key, const int& val) {
    return false;
}

int main (int argc, char * const argv[]) {

    if (blah(), 5) {
        cout << "if block";
    } else {
        cout << "else block";
    }

    return 0;
}

(herausgegeben Komma-Operator zeigen Szenario zu überlasten. Dank David Pierre auf diese zur Kommentierung)

Eines weiß ich, dass diese Art von Code tun soll: Es sollte feuerte den Coder erhalten. Ich wäre ein bisschen Angst, jemand neben arbeiten, der so schreibt.

Im pathologischen Fall, es hängt davon ab, was der Komma-Operator funktioniert ...

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

bool operator,(PlaceHolder, int) { return false; }

if (Blah(), 5)
{
    cout << "This will never run.";
}

Ich würde sagen, das hängt von blah ().

Auf einer breiten Antwort. Der Komma-Operator (nicht überlastet) löst, wie in dem ersten Teil ausführen und den zweiten Teil zurück.

Also, wenn Sie (foo (), Bar ()) Beiden Funktionen ausgeführt werden, aber der Wert des Ausdrucks auswertet bar () (und die Art des Ausdrucks als auch).

Während ich will nicht sagen, es gibt faire Verwendungen für das, ist in der Regel ein bisschen schwer als Code zu lesen. Vor allem, weil nicht viele Sprachen Aktien solcher Konstrukte. So Als persönliche Faustregel vermeide ich es, wenn ich Code zu einem preexistent Ausdruck bin das Hinzufügen und will nicht vollständig sein Format ändern.

Beispiel: Ich habe ein Makro (nicht diskutieren, wenn Sie Makros verwenden soll oder nicht, manchmal ist es nicht einmal Sie, dass es geschrieben)

FIND_SOMETHING (X) (x> 2)? find_fruits (x): find_houses (x)

Und ich es in der Regel in Zuweisungen wie my_possession = FIND_SOMETHING (34);

Jetzt möchte ich log für debuggin Zwecke, um es hinzuzufügen, aber ich kann nicht die Entdeckung Funktionen ändern ,. Ich konnte tun:

FIND_SOMETHING (X) (x> 2)? (LOG ( "Suche nach Früchte"), find_fruits (x)) :( LOG ( "Suche Häuser"), find_houses (x))

Ich benutze manchmal wie diese Konstrukte Zwecke für die Fehlersuche. Wenn ich die Kraft, wenn in der Nähe gilt unabhängig von dem Rückgabewert von blah zu sein. Es ist offensichtlich, dass es nie in der Produktion Code erscheinen soll.

In dem folgenden geschrieben wurde vorausgesetzt, es C-Code, entweder in einer C-Datei oder in einem C-Block aus einer C ++ Datei ist:

Es ist eine sinnlose , wenn . Es ruft blah (), aber das Ergebnis blah () wird nicht berücksichtigt von , wenn überhaupt. Das einzige, was in Betracht gezogen wird, ist 5, also die, wenn immer auf true bewerten. IOW könnten Sie diesen Code wie

schreiben
blah();
// do something

ohne , wenn überhaupt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top