12
votes

Deux chaînes entre parenthèses séparées par une virgule en C ++

Duplicaté possible:

opérateur de virgule C ++

J'ai rencontré un comportement inattendu (à moi au moins) C ++ aujourd'hui, montré par la sélection suivante: xxx

sortie: xxx

Cela fonctionne avec n'importe quel nombre de cordes entre les parenthèses. Testé sur le compilateur Visual Studio 2010 ainsi que sur CodpePad.

Je me demande pourquoi cela compile en premier lieu, quelle est l'utilisation de cette "fonctionnalité"?


2 commentaires

C ++ dispose d'un opérateur de virgule Stackoverflow.com/questions/54142/c-comma-pérator


Vous avez compris que ce serait un duplicata, cela ne m'a pas eu pour moi de rechercher un opérateur de virgule. Merci pour toutes les réponses quand même!


5 Réponses :


15
votes

ahh, c'est l'opérateur des virgules. Lorsque vous utilisez une virgule et deux (ou plus) expressions, ce qui se passe est que toutes les expressions sont exécutées et que le résultat est le résultat de la dernière expression. C'est pourquoi vous obtenez "2" à la suite de cela. Voir ici pour une plus grande explication.


0 commentaires

0
votes

L'opérateur de la virgule évalue les expressions des deux côtés de la virgule, mais renvoie le résultat de la seconde.


0 commentaires

3
votes

opérateur de virgule (,) L'opérateur de la virgule (,) est utilisé pour séparer deux expressions ou plus comprises dans lesquelles une seule expression est attendue. Lorsque l'ensemble des expressions doit être évalué pour une valeur, seule l'expression la plus à droite est considérée.

Par exemple, le code suivant: xxx

ref: http: / /www.cplusplus.com/doc/Tutorial/opérateurs /


2 commentaires

Crucialité, l'opérateur de la virgule introduit un point de séquence, garantissant que chacune des expressions de gauche à droite est exécutée dans l'ordre, de sorte que b = 3 aura définitivement exécuté avant B + 2 commence (au moins du point de vue du comportement observable).


exactement. Dans ce cas, A = 5, B = 3.



1
votes

Le résultat de la virgule (",") est la bonne subexpression. Je l'utilise dans des boucles sur les conteneurs STL:

for( list<int>::iterator = mylist.begin(), it_end = mylist.end(); it != it_end; ++it )
  ...


4 commentaires

Sauf qu'il n'y a pas d'opérateur de virgule dans votre exemple.


@Jameskanze Je pense qu'il manque le nom de la variable après la première déclaration d'itérateur et la déclaration de type pour it_end , mais ils sont séparés par une virgule ...


Ils sont effectivement séparés par une virgule, mais je pense que James signifiait que cette virgule n'est pas "virgule de l'opérateur", mais cela fait plutôt partie d'une liste de déclaration variable. James, merci de l'avoir souligné, je vais en lire à ce sujet.


@Alexandercherttvertov exactement. La plupart des virgules ne sont pas des opérateurs, mais une partie de la syntaxe générale. La différence est très importante; Si vous surchargez l'opérateur de la virgule, la surcharge ne sera prise en compte que dans des contextes où la virgule est en fait un opérateur. (Ce n'est pas que la surcharge de l'opérateur de la virgule est une bonne idée, à moins que votre objectif soit l'obscurcissement.)



8
votes

Ça s'appelle l'opérateur des virgules: dans une expression x, y , le compilateur d'abord évalue x (y compris tous les effets secondaires), puis y ; les résultats de l'expression sont les résultats de y .

dans l'expression que vous citez, il n'a absolument aucune utilité; la première chaîne est simplement ignoré. Si la première expression a des effets secondaires, cependant, Cela pourrait être utile. (Principalement pour l'obfuscation, à mon avis, et c'est mieux évité.)

note aussi que cela ne fonctionne que lorsque la virgule est un opérateur. Si ça peut être autre chose (par exemple la ponctuation séparant les arguments d'un fonction), c'est. Donc: xxx

(voir. Je vous ai dit que c'était bon pour l'obfuscation.)


2 commentaires

"Principalement pour l'obfuscation, à mon avis, et il est préférable d'éviter" - une utilisation classique et raisonnable consiste à modifier plusieurs variables dans pour boucles, par ex. pour (; x> y; x--, y ++) ...


@Tonydelroy j'ai dit surtout . Je ne suis pas sûr que je ne préférerais pas un pendant en boucle dans le cas de votre site, mais c'est certainement un cas où il est sans doute acceptable. L'autre utilisation "largement répandue" est dans les macros, où il peut être utilisé pour effectuer deux instructions apparaissant comme un appel de fonction unique, ou de "coerce" une fonction vide (par exemple, abandon à un type donné, donc qu'il peut être utilisé dans un opérateur ternaire.