Ist es ratsam, den Komma-Operator zu verwenden?

8

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?

    
John Humphreys - w00te 21.11.2011, 23:08
quelle

10 Antworten

11

Dies kann in der Bedingung von while() loops nützlich sein:

%Vor%

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.

    
caf 21.11.2011, 23:32
quelle
8

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.

    
Seth Carnegie 21.11.2011 23:10
quelle
2

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.

    
Benjamin Lindley 21.11.2011 23:33
quelle
1

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.

    
MByD 21.11.2011 23:10
quelle
1

Die einzige sinnvolle Verwendung, die ich mir vorstellen kann, ist im for -Konstrukt

%Vor%

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 ...

    
6502 21.11.2011 23:13
quelle
1

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.

    
Bowie Owens 21.11.2011 23:46
quelle
1

Innerhalb von for loop constructs kann es sinnvoll sein. Obwohl ich im Allgemeinen finde, dass sie in diesem Fall schwerer zu lesen sind.

Es ist auch sehr praktisch, um Ihre Mitarbeiter und Mitarbeiter auf SO zu verärgern.

%Vor%     
Tom Kerr 21.11.2011 23:35
quelle
0

Ich benutze auch den Komma-Operator, um verwandte Operationen zusammenzufügen:

%Vor%     
perreal 22.11.2011 00:16
quelle
0

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:

  • Das Ersetzen der meisten Semikolons durch Kommas würde die Struktur der meisten C- und C ++ - Codes sofort klarer machen und einige allgemeine Fehler beseitigen.
  • Dies ist mehr im Geschmack der funktionalen Programmierung als im Gegensatz zu Imperativ.
  • Javascript 'automatische Semikolon Insertion' ist eine seiner umstrittenen syntaktischen Funktionen.

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?

>     
Joseph Quinsey 22.11.2011 03:24
quelle
0

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). :

%Vor%

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.

    
monkey_05_06 10.10.2017 07:31
quelle

Tags und Links