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%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.
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.
init-declarator-list Die verschiedenen Namen, die in einer Deklaration deklariert sind
Beispiel:
%Vor%member-declarator-list Ähnlich der init-Deklaratorliste, aber für member-Deklarationen in Klassen.
Beispiel:
%Vor%mem-initializer-list Liste der Initialisierer für members
Beispiel:
%Vor%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.
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.
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.
Tags und Links c++ comma-operator