Si vous voyez ce code, Où est-ce que tout fait une virgule f (23, 23) code> ne compile pas car la virgule agit comme un séparateur ici et non comme un opérateur de virgule . P>
5 Réponses :
L'utilisation du jeton des virgules en tant que l'opérateur est
distinct de son utilisation dans Appels et définitions de fonction, Déclarations variables, Enum Déclarations et constructions similaires, où il agit comme un séparateur. fort> p> blockQuote>
Quelles sont les "constructions similaires"?
@Philipp: Fondamentalement, ces constructions dans lesquelles la grammaire décrit explicitement le sens de la virgule. La liste ci-dessus saute par exemple des déclarations membres et d'amis, qui sont très similaires aux déclarations variables. Un autre exemple serait une expression d'objet temporaire telle que complexe (0,1) code> qui est similaire à un appel de fonction.
Un opérateur de virgule sert toujours d'opérateur de la virgule, mais une virgule ne signifie pas toujours un opérateur de virgule - parfois c'est juste la ponctuation. P>
quant à la ponctuation, la réponse simple est "lorsque la norme le dit." En passant par toutes les situations où la norme dit que cela donne une réponse beaucoup plus longue - mais il est peu probable qu'il soit beaucoup plus utile, car (pour un exemple), il doit traiter un certain nombre de cas de coin que la plupart des gens ne se soucient pas beaucoup à propos de. p>
Cela concerne la définition de la langue des expressions, qui est assez complexe. P>
f (1, 2) code> est une expression d'appel de fonction avec deux paramètres. Contrairement,
f ((1, 2)) code> est une expression d'appel de fonction avec un paramètre, qui est la sous-expression
1, 2 code>, qui sera évaluée à 2. < / p>
Parce que la virgule est un opérateur ici! Le résultat de l'expression la plus à droite est renvoyé. Juste pour des éclaircissements à n'importe quel lecteur
d'un point de vue grammatical, les paramètres d'un appel de fonction forment une liste d'expression en option em> à l'intérieur des parenthèses. Une liste expression em> consiste en une ou plusieurs expression-expression em> séparée par un jeton de la virgule. Une virgule ne peut signifier qu'un opérateur de virgule où une expression est attendue. L'opérateur de la virgule fait un em> expression em> hors d'une expression em>, a Par exemple, vous pouvez surveiller tout expression em> (y compris l'un à l'aide de l'opérateur de la virgule) à l'intérieur des parenthèses à partir d'un expression primaire em> qui est une expression attribution em> et donc valable dans un expression-liste em>. p> par exemple p> postfix-expression em> où la liste expression em> consiste à Deux affectation-expression em> chacun d'entre eux est un identifiant em>. p> postfix-expression em> où la expression-liste em> consiste en une seule affectation expres Sion EM> qui est un expression primaire em> qui est une expression em> parenthèses em> à l'aide de l'opérateur de la virgule. p> , code> et un expression-expression em>, mais un expression em> impliquant un opérateur de virgule n'est pas lui-même un affectation-expression em> ne peut pas apparaître dans une liste expression em> sauf où il s'agit d'un constituant de quelque chose qui est un affectation-expression em>. p>
f( (a, b) );
J'ai effectué une recherche sur le projet de norme. Fondamentalement, dans la grammaire, les productions code> code> sont celles qui ont des virgules dans eux pour séparer différents éléments. Les résultats suivants sont spécifiques C ++ 03. Dans C ++ 0X, expression-list em> délégués directement à la liste d'initialistes em> car dans les listes de brace C ++ 0x peut se produire dans des arguments de fonction et de constructeur également. init-déclare-liste strong> Les différents noms déclarés dans une déclaration em> p> p>
Exemple: P>
membre-déclarateur-list strong> similaire à la liste des déclarateurs init, mais pour Déclarations membres em> dans les classes. P>
Exemple: P>
Exemple: P>
Exemple: P>
void f() throw(int, bool) { }
struct A { A():a(0), b(0) { } int a; int b; };
struct A { int a, b; };
int a, b;