Ich habe kürzlich (nur auf SO tatsächlich) in Anwendungen des C / C ++ - Komma-Operators gelaufen. Von dem, was ich sagen kann, erzeugt es einen Sequenzpunkt auf der Linie zwischen den linken und rechten Operatoren, so dass Sie eine vorhersagbare (definierte) Reihenfolge der Auswertung haben.
Ich bin ein wenig verwirrt darüber, warum dies in der Sprache zur Verfügung gestellt wird, da es wie ein Patch aussieht, der auf Code angewendet werden kann, der gar nicht funktionieren sollte. Ich kann mir schwer vorstellen, dass ein Ort, an dem er verwendet werden könnte, nicht übermäßig komplex ist (und refaktorisiert werden muss).
Kann jemand den Zweck dieses Sprachmerkmals erklären und wo es möglicherweise in realem Code (innerhalb des Grundes) verwendet wird, wenn überhaupt?
Dies kann in der Bedingung von while()
loops nützlich sein:
Dadurch wird vermieden, dass Sie die update_thing()
-Zeile duplizieren müssen, während Sie die exit-Bedingung innerhalb des while()
-Controlling-Ausdrucks beibehalten, wo Sie es erwarten. Es spielt auch gut mit continue;
.
Es ist auch nützlich beim Schreiben komplexer Makros, die einen Wert auswerten.
Der Komma-Operator trennt nur Ausdrücke, so dass Sie mehrere Dinge tun können, statt nur eines, wo nur ein einziger Ausdruck benötigt wird. Sie können Dinge tun wie
%Vor% Beachten Sie, dass x
nicht der Kommaoperator ist, sondern y
ist.
Du musst wirklich nicht darüber nachdenken. Es hat etwas mehr arkane Verwendungen, aber ich glaube nicht, dass sie jemals absolut notwendig sind, also sind sie nur Kuriositäten.
Jeder sagt, dass es oft in einer for-Schleife verwendet wird, und das stimmt. Ich finde jedoch, dass es in der Bedingungserklärung der for-Schleife nützlicher ist. Zum Beispiel:
%Vor% Das Umschreiben ohne den Komma-Operator würde mindestens eines der wenigen Dinge erfordern, mit denen ich mich nicht ganz auskenne, wie x außerhalb des Bereichs zu deklarieren, in dem es verwendet wird, oder den ersten Aufruf von get_x()
als Sonderzeichen.
Ich plane auch Wege, wie ich es mit C ++ 11 constexpr Funktionen nutzen kann, da ich denke, dass sie nur aus einzelnen Anweisungen bestehen können.
Ich denke, das einzige gängige Beispiel ist die for-Schleife:
%Vor%Wie in der c-faq erwähnt:
Ab und zu befinden Sie sich in einer Situation, in der C ein erwartet einzelner Ausdruck, aber Sie haben zwei Dinge, die Sie sagen möchten. Am meisten gemeinsames (und tatsächlich das einzige gemeinsame) Beispiel ist in einer for-Schleife, speziell die ersten und dritten steuernden Ausdrücke.
Die einzige sinnvolle Verwendung, die ich mir vorstellen kann, ist im for
-Konstrukt
ermöglicht die gleichzeitige Erhöhung mehrerer Variablen, wobei die for
Konstruktstruktur beibehalten wird (für ein geschultes Auge einfach zu lesen und zu verstehen).
In anderen Fällen stimme ich zu, es ist eine Art schlechter Hack ...
Der Komma-Operator ist nützlich, um Sequenzen an Stellen einzufügen, an denen Sie keinen Codeblock einfügen können. Wie bereits erwähnt, ist dies praktisch beim Schreiben von kompakten und lesbaren Schleifen. Darüber hinaus ist es in Makrodefinitionen nützlich. Das folgende Makro erhöht die Anzahl der Warnungen und wenn eine boolesche Variable gesetzt ist, wird auch die Warnung angezeigt.
%Vor%Damit Sie schreiben können (Beispiel 1):
%Vor%Der Komma-Operator ist effektiv eine schlechte Lambda-Funktion.
Wenn man den Advokaten des Teufels spielt, könnte es sinnvoll sein, die Frage umzukehren:
Ist es empfehlenswert, immer den Semikolon-Terminator zu verwenden?
Einige Punkte:
Ob diese Praxis "häufige Fehler" erhöht, ist unbekannt, weil niemand dies tut.
Aber natürlich, wenn Sie das tun würden, würden Sie wahrscheinlich Ihre Mitprogrammierer ärgern und ein Paria auf SO werden.
Bearbeiten: Siehe AndreyTs ausgezeichnete Antwort von 2009 auf Verwendet den C-Komma-Operator . Und Joel 2008 spricht auch ein wenig über die beiden syntaktischen Kategorien in C # / C / C ++.
Als ein einfaches Beispiel ist die Struktur von while (foo) a, b, c;
klar, aber while (foo) a; b; c;
ist irreführend, wenn keine Einrückung oder geschweifte Klammern oder beides vorhanden sind.
Bearbeiten # 2 : Wie AndreyT sagt:
[Die] C-Sprache (wie auch C ++) ist historisch eine Mischung aus zwei völlig verschiedenen Programmierstilen, die man als "Anweisungsprogrammierung" und "Ausdrucksprogrammierung" bezeichnen kann.
Aber seine Behauptung, dass "in der Praxis Aussage -Programmierung viel besser lesbaren Code erzeugt [Hervorhebung hinzugefügt] ist offenkundig falsch . Welches der folgenden zwei Zeilen ist Ihrer Meinung nach an Ihrem Beispiel besser lesbar?
%Vor%Antwort : Sie sind beide nicht lesbar. Es ist das white space , das die Lesbarkeit - Hurra für Python! Der erste ist kürzer. Aber die Semikolon-Version hat mehr Pixel von schwarzen Raum oder grünen Raum , wenn Sie ein Hazeltine-Terminal haben - was könnte das eigentliche Problem hier sein?
> Obwohl es ein paar Monate nach der Ratifizierung von C ++ 11 gepostet wurde, sehe ich hier keine Antworten zu constexpr
functions. Diese Antwort auf eine nicht ganz verwandte Frage bezieht sich auf eine Diskussion über den Komma-Operator und dessen Nützlichkeit in konstanten Ausdrücken, wobei der new constexpr
keyword wurde speziell erwähnt.
Während C ++ 14 einige der Einschränkungen für constexpr
-Funktionen lockerte, ist es dennoch nützlich zu beachten, dass der Kommaoperator Ihnen vorhersagbar angeordnete Operationen innerhalb einer constexpr
-Funktion gewähren kann, wie zB (aus der oben erwähnten Diskussion). :
Oder sogar etwas wie:
%Vor% Ob dies nützlich ist, hängt ganz von der Implementierung ab, aber dies sind nur zwei schnelle Beispiele dafür, wie der Komma-Operator in einer constexpr
-Funktion angewendet werden kann.