Warum wird dieser C++-Code kompiliert? Was tut es? [duplicate]

Lesezeit: 2 Minuten

Ich hatte dieses Problem, als ich versehentlich den Methodennamen gelöscht habe. Der Code ging aus

bool bRet = MethodName(pData, pOutFilename);

zu

bool bRet = (pData, pOutFilename);

aber trotzdem kompiliert? Was macht dieser Code? Was bedeutet das? Es scheint wahr zurückzugeben, ist dies immer der Fall (auch wenn pData null ist)?

Alle Ideen sind willkommen!

  • Überprüfen Sie den Kommaoperator. Gleich wie pData; bool bRet=pOutFilename;

    – LS_ᴅᴇᴠ

    22. Juli 2013 um 10:30 Uhr

es ist der “Komma-Operator” die

wertet seinen ersten Operanden aus und verwirft das Ergebnis, wertet dann den zweiten Operanden aus und gibt diesen Wert (und Typ) zurück.

  • Für eine “irgendwie praktische” Verwendung, if (condition) return fprintf(stderr, "Debug message\n"), FALSE; Wenn Sie vorübergehend eine Debug-Meldung hinzufügen möchten, ohne auch Klammern hinzufügen zu müssen.

    – Robert Fischer

    22. Juli 2013 um 15:45 Uhr

  • @RobertFisher interessant … kann es auch sein i = DEBUG_VALUE, j;

    – Grijesh Chauhan

    22. Juli 2013 um 16:39 Uhr


  • Es ist erwähnenswert, dass der Wert von pOutFilename wird implizit umgewandelt in bool. Vorausgesetzt pOutFilename ein Zeiger ist, ist das Ergebnis false wenn pOutFilename ist ein Nullzeiger, true Andernfalls.

    – Keith Thompson

    22. Juli 2013 um 20:09 Uhr

Benutzer-Avatar
Grijesh Chauhan

Ihr Ausdruck bool bRet = (pData, pOutFilename); ist ein gültiger Ausdruck und entspricht dem Ausdruck bool bRet = pOutFilename;

Im bool bRet = (pData, pOutFilename);erster Ausdruck pData ausgewertet wird, dann der zweite Ausdruck pOutFilename ausgewertet wird, dann wird der Wert des zweiten Ausdrucks zugewiesen bRet (das ist wie , Bediener arbeitet von links nach rechts).

Lesen: Komma-Operator: ,

Der Kommaoperator , hat left-to-right associativity. Zwei durch ein Komma getrennte Ausdrücke werden von links nach rechts ausgewertet. Der linke Operand wird immer ausgewertet, und alle Seiteneffekte werden abgeschlossen, bevor der rechte Operand ausgewertet wird.

Um die Bedeutung von Klammern zu verstehen ( ) Betrachten Sie in Ihrem Ausdruck mein Beispiel unten. Beachten Sie die Ausgabe in diesem Beispiel (ich habe ein C-Beispiel):

int main () {
   int i = 10, b = 20, c= 30;
   i = b, c;   // i = b
   printf("%i\n", i);

   i = (b, c); // i = c
   printf("%i\n", i);
}

Ausgang:

20
30

Um die Ausgabe zu verstehen: schau dir die Vorrangtabelle an , haben einen niedrigeren Vorrang als =. In Ihrem Ausdruck müssen Sie die Priorität mit Klammern überschreiben.

  • Außer wenn pData hat Nebenwirkungen, schätze ich.

    – Joey

    22. Juli 2013 um 10:29 Uhr

  • was es nur haben könnte, wenn es ein Makro wäre

    – Stefano Falasca

    22. Juli 2013 um 10:30 Uhr

  • @StefanoFalasca Wenn pData nicht initialisiert ist, ist es möglich, die verschiedenen anwendbaren Standards so zu interpretieren, dass dies bedeutet pData in pData, pOutFilename ist manchmal undefiniertes Verhalten. Es kann auch etwas passieren, wenn pData ist eine Gleitkommavariable, die eine Signalisierungs-NaN enthält, aber darüber weiß ich nicht viel.

    – Pascal Cuoq

    22. Juli 2013 um 10:37 Uhr

Benutzer-Avatar
Santhosh Pai

Es ist ein , Komma-Operator. Wenn Sie einen Ausdruck wie diesen haben:

i = (a, b);        

b wird darin gespeichert i .

Also in deinem Fall:

bRet = pOutFilename;

pOutFilename wird darin gespeichert bRet.

1310570cookie-checkWarum wird dieser C++-Code kompiliert? Was tut es? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy