Ist es eine gute Praxis, den Komma-Operator zu verwenden?

  • Ich habe in letzter Zeit (nur bei SO eigentlich) die Verwendung des C / C ++ - Kommaoperators ausgeführt. Soweit ich das beurteilen kann, wird auf der Linie zwischen den Operatoren für die linke und rechte Seite ein Sequenzpunkt erstellt, so dass Sie eine vorhersagbare (definierte) Reihenfolge der Auswertung haben.

    I ' Ich bin etwas verwirrt darüber, warum dies in der Sprache bereitgestellt wird, da es wie ein Patch aussieht, das auf Code angewendet werden kann, der überhaupt nicht funktionieren sollte. Ich kann mir kaum vorstellen, an einen Ort zu denken, an dem er verwendet werden könnte, der nicht übermäßig komplex war (und Refactoring erforderlich ist).

    Kann jemand den Zweck dieser Sprachfunktion erklären und wo? wenn überhaupt, kann es in realem Code verwendet werden (aus gutem Grund)?

    22 November 2011
    John Humphreys - w00te
9 answers
  • Dies kann nützlich sein, wenn while() Schleifen verwendet werden:

     while (update_thing(&foo), foo != 0) {
        /* ... */
    }
     

    Dies vermeidet Sie müssen die Zeile update_thing() duplizieren und dabei die Beendigungsbedingung innerhalb des steuernden Ausdrucks while() beibehalten, wo Sie sie erwarten. Es spielt auch gut mit continue;.

    Es ist auch hilfreich beim Schreiben komplexer Makros, die einen Wert auswerten.

    23 November 2011
    caf
  • Der Komma-Operator trennt nur Ausdrücke, so dass Sie mehrere Dinge tun können, anstatt nur eine zu machen, bei der nur ein einziger Ausdruck erforderlich ist. Sie können beispielsweise

                  (x)              (y)
    for (int i = 0, j = 0; ...; ++i, ++j)
     

    Beachten Sie, dass x nicht der Kommaoperator ist, sondern y .

    Sie müssen wirklich nicht darüber nachdenken. Es gibt ein paar geheimnisvollere Anwendungen, aber ich glaube nicht, dass sie jemals absolut notwendig sind, also sind es nur Kuriositäten.

    22 November 2011
    Seth Carnegie
  • Innerhalb von for -Konstrukten kann es sinnvoll sein. Ich finde, dass sie in diesem Fall im Allgemeinen schwerer zu lesen sind.

    Es ist auch sehr praktisch, wenn Sie Ihre Kollegen und Mitarbeiter über SO aufregen > bool guess() { return true, false; }

    22 November 2011
    Tom KerrNullPoiиteя
  • Jeder sagt, dass er oft in einer for-Schleife verwendet wird, und das stimmt. Ich finde es jedoch nützlicher in der Bedingungsanweisung der for-Schleife. Zum Beispiel:

     for (int x; x=get_x(), x!=sentinel; )
    {
        // use x
    }
     

    Wenn Sie das ohne den Komma-Operator umschreiben, müssen Sie mindestens eines der folgenden Dinge tun Ich bin nicht ganz zufrieden damit, z. B. das Deklarieren von x außerhalb des Gültigkeitsbereichs, in dem es verwendet wird, oder der erste Aufruf von get_x() in speziellen Gehäusen Verwenden Sie es mit C ++ 11-Constexpr-Funktionen, da diese vermutlich nur aus einzelnen Anweisungen bestehen können.

    22 November 2011
    Benjamin Lindley
  • Ich denke, das einzige gängige Beispiel ist die for - Schleife:

     for (int i = 0, j = 3; i < 10 ; ++i, ++j)
     

    Wie im c-faq :

    Hin und wieder befinden Sie sich in einer Situation, in der C einen einzelnen Ausdruck erwartet, Sie haben jedoch zwei Dinge, die Sie sagen möchten. Das häufigste (und tatsächlich das einzige) Beispiel ist eine for-Schleife, insbesondere der erste und der dritte Steuerausdruck.

    22 November 2011
    MByD
  • Die einzige sinnvolle Verwendung, die mir einfällt, ist das Konstrukt for

     for (int count=0, bit=1; count<10; count=count+1, bit=bit<<1)
    {
        ...
    }
     

    da es das Inkrementieren mehrerer Variablen gleichzeitig ermöglicht, bleibt die Konstruktionsstruktur for erhalten (für ein geschultes Auge leicht lesbar und verständlich).

    In anderen Fällen stimme ich zu Es ist eine Art schlechter Hack ...

    22 November 2011
    6502
  • Mit dem Komma-Operator können Sie Sequence an Stellen einfügen, an denen Sie keinen Codeblock einfügen können. Wie bereits erwähnt, ist dies beim Schreiben kompakter und lesbarer Loops hilfreich. Darüber hinaus ist es nützlich in Makrodefinitionen. Das folgende Makro erhöht die Anzahl der Warnungen. Wenn eine boolesche Variable festgelegt ist, wird auch die Warnung angezeigt.

     #define WARN if (++nwarnings, show_warnings) std::cerr
     

    Damit Sie schreiben können (Beispiel 1):

     if (warning_condition)
        WARN << "some warning message.\n";
     

    Der Komma-Operator ist praktisch eine arme Lambda-Funktion.

    22 November 2011
    Bowie Owens
  • Obwohl einige Monate nach der Ratifizierung von C ++ 11 gepostet, sehe ich hier keine Antworten zu constexpr -Funktionen. Diese Antwort auf eine nicht ganz zusammenhängende Frage verweist auf eine Diskussion über den Kommaoperator und seine Nützlichkeit in konstanten Ausdrücken, in denen die Das neue Schlüsselwort constexpr wurde speziell erwähnt.

    Auch wenn C ++ 14 einige Einschränkungen für constexpr -Funktionen gelockert hat, ist es dennoch nützlich zu wissen, dass der Kommaoperator dies zulassen kann Sie haben auf vorhersagbare Weise Operationen innerhalb einer constexpr -Funktion geordnet, wie (aus der oben genannten Diskussion):

     template<typename T>
    constexpr T my_array<T>::at(size_type n)
    {
        return (n < size() || throw "n too large"), (*this)[n];
    }
     

    Or Sogar so etwas wie:

     constexpr MyConstexprObject& operator+=(int value)
    {
        return (m_value += value), *this;
    }
     

    Ob dies nützlich ist, hängt von der Implementierung ab, aber dies sind nur zwei kurze Schritte Beispiele, wie der Komma-Operator in einer Funktion constexpr angewendet werden kann.

    10 October 2017
    monkey0506
  • Ich verwende auch den Komma-Operator, um verwandte Operationen zusammenzukleben:

     void superclass::insert(item i) {
      add(i), numInQ++, numLeft--;
    }
     
    22 November 2011
    perreal