Wenn der Komma-Operator nicht als Kommaoperator fungiert?

8

Wenn Sie diesen Code sehen,

%Vor%

f(23, 23) wird nicht kompiliert, da das Komma hier als Trennzeichen fungiert und nicht als Kommaoperator.

Wo funktioniert ein Komma nicht als Kommaoperator? Oder umgekehrt?

    
Lazer 27.06.2010, 18:20
quelle

5 Antworten

11

Aus grammatikalischer Sicht bilden die Parameter eines Funktionsaufrufs eine optionale Ausdrucksliste in Klammern. Eine Ausdruckliste besteht aus einem oder mehreren Zuweisungsausdrücken , die durch ein Kommatoken getrennt sind. Ein Komma kann nur einen Komma-Operator angeben, für den ein Ausdruck erwartet wird.

Der Komma-Operator erzeugt einen Ausdruck aus einem Ausdruck , einem , und einem Zuweisungsausdruck , aber einem Ausdruck , der einen Kommaoperator enthält, ist selbst kein Zuweisungsausdruck und kann daher nicht in einer Ausdrucksliste vorkommen, außer wenn er Bestandteil von etwas ist, das ein ist Zuweisungsausdruck .

Sie können z. B. einen -Ausdruck (einschließlich eines mit dem Komma-Operator) innerhalb von Klammern von einem primären Ausdruck umgeben, der ein Zuweisungsausdruck ist und daher gültig in einer Ausdruckliste .

z. B.

Postfixausdruck wobei die Ausdruckliste aus zwei Zuweisungsausdrücken besteht, von denen jeder ein Bezeichner .

%Vor%

postfix-expression wobei die Ausdruckliste aus einem einzelnen Zuweisungsausdruck besteht, der ein primärer Ausdruck ist em> ist ein eingeklammerter Ausdruck mit dem Komma-Operator.

%Vor%     
Charles Bailey 27.06.2010, 18:35
quelle
8
  

Die Verwendung des Komma-Tokens als   Operator ist von seiner Verwendung in   Funktionsaufrufe und Definitionen,   Variablendeklarationen, enum   Deklarationen und ähnliche Konstrukte,   wo es als Trennzeichen fungiert.

Wikipedia - Kommaoperator

    
Justin Niessner 27.06.2010 18:24
quelle
8

Ich habe eine Suche nach dem Standardentwurf durchgeführt. Im Grunde sind in der Grammatik die -list -Produktionen diejenigen, die Kommas enthalten, um verschiedene Elemente zu trennen. Die folgenden Ergebnisse sind C ++ 03 spezifisch. In C ++ 0x delegiert expression-list direkt an initializer-list , weil in C ++ 0x geschweifte Klammern in Funktions- und Konstruktorargumenten vorkommen können.

  • Ausdruckliste Für Funktionen / Konstruktorargumente (einschließlich funktionaler Umwandlungen)
  • Enumeratorliste Die Liste der Elemente einer Enumeration
  • init-declarator-list Die verschiedenen Namen, die in einer Deklaration deklariert sind

    Beispiel:

    %Vor%
  • Parameter-Deklarationsliste Die Parameter Deklarationsliste (Überraschung!) einer Funktion
  • initializer-list Liste ähnlich wie expression-list, kann aber auch Listen mit erweiterten Ausdrücken enthalten. Wird für Aggregat-Initialisierung (Initialisierung von Arrays oder Strukturen)
  • verwendet
  • member-declarator-list Ähnlich der init-Deklaratorliste, aber für member-Deklarationen in Klassen.

    Beispiel:

    %Vor%
  • Basis-Spezifizierer-Liste Liste von Basis-Klassen einer Klasse.
  • mem-initializer-list Liste der Initialisierer für members

    Beispiel:

    %Vor%
  • Vorlagenparameterliste Liste der Vorlagenparameter -Deklarationen.
  • template-argument-list Liste der Template-Argumente , die an eine Vorlage übergeben werden.
  • type-id-Liste Liste der Typen für Ausnahmenspezifikationen

    Beispiel:

    %Vor%

Es gibt eine Bezeichnerliste auch für Makroparameter, die ich nicht in dieser Liste habe, weil sie wirklich Teil der Präprozessorgrammatik ist.

    
Johannes Schaub - litb 27.06.2010 21:51
quelle
7

Das hat mit der Sprachdefinition von Ausdrücken zu tun, die ziemlich komplex ist.

f(1, 2) ist ein Funktionsaufruf-Ausdruck mit zwei Parametern. Im Gegensatz dazu ist f((1, 2)) ein Funktionsaufruf-Ausdruck mit einem Parameter, der der Unterausdruck 1, 2 ist, der zu 2 ausgewertet wird.

    
GManNickG 27.06.2010 18:30
quelle
1

Ein Komma-Operator fungiert immer als Komma-Operator, aber ein Komma bedeutet nicht immer einen Komma-Operator - manchmal ist es nur eine Interpunktion.

Wenn es sich um Interpunktion handelt, lautet die einfache Antwort "wenn der Standard dies sagt". Durch alle Situationen zu gehen, in denen der Standard dies sagt, gibt eine viel längere Antwort - aber eine, die wahrscheinlich nicht viel nützlicher ist, weil sie sich mit einer Reihe von Fällen befassen muss, die den meisten Menschen egal sind ungefähr.

    
Jerry Coffin 27.06.2010 18:29
quelle

Tags und Links