8
votes

Quand tout l'opérateur de la virgule ne joue-t-il pas d'opérateur de la virgule?

Si vous voyez ce code, xxx

f (23, 23) ne compile pas car la virgule agit comme un séparateur ici et non comme un opérateur de virgule .

Où est-ce que tout fait une virgule non comme opérateur de la virgule? Ou l'inverse?


0 commentaires

5 Réponses :


8
votes

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.

Wikipedia - opérateur de virgule


2 commentaires

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) qui est similaire à un appel de fonction.



1
votes

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.

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.


0 commentaires

7
votes

Cela concerne la définition de la langue des expressions, qui est assez complexe.

f (1, 2) est une expression d'appel de fonction avec deux paramètres. Contrairement, f ((1, 2)) est une expression d'appel de fonction avec un paramètre, qui est la sous-expression 1, 2 , qui sera évaluée à 2. < / p>


1 commentaires

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



11
votes

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

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> xxx pré>

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>

f( (a, b) );


0 commentaires

8
votes

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.

  • Liste d'expression forte> pour fonctions / arguments de constructeur em> (incluant des mises fonctionnelles) li>
  • énumérateur-liste forte> la liste des éléments d'un énumération em> li>
  • init-déclare-liste strong> Les différents noms déclarés dans une déclaration em> p> p>

    Exemple: P>

    void f() throw(int, bool) { }
    
  • PARAMETER-DÉCLARATION-LISTE FORT> La liste de déclaration em> paramètre em> (surprise!) de la fonction em> li> li>
  • Liste d'initialisateur Strong> Liste similaire à la liste d'expression, mais peut inclure des listes d'expression soudées. Utilisé pour initialisation globale em> (réparations d'initialisation ou structs) li>
  • membre-déclarateur-list strong> similaire à la liste des déclarateurs init, mais pour Déclarations membres em> dans les classes. P>

    Exemple: P>

    struct A { A():a(0), b(0) { } int a; int b; };
    
  • Spécificateur de base-Liste Strong> Liste des classes de base em> d'une classe. li>
  • MEM-INITIZER-LISTE STRUT> Liste des EM> Initialiseurs em> pour membres em> p> p>

    Exemple: P>

    struct A { int a, b; };
    
  • Template-paramètre-list strong> Liste des paramètres de modèle em> Déclarations. li>
  • Template-argument-list strong> Liste des Arguments de modèle em> transmis à un modèle. li>
  • ID de type-list strong> Liste des types pour Spécifications d'exception em> p>

    Exemple: P>

    int a, b;
    


0 commentaires