Duplicaté possible: strong>
opérateur de virgule C ++ p>J'ai rencontré un comportement inattendu (à moi au moins) C ++ aujourd'hui, montré par la sélection suivante: p>
xxx pré> sortie: p>
xxx Pré> Cela fonctionne avec n'importe quel nombre de cordes entre les parenthèses. Testé sur le compilateur Visual Studio 2010 ainsi que sur CodpePad. P>
Je me demande pourquoi cela compile en premier lieu, quelle est l'utilisation de cette "fonctionnalité"? P> blockQuote>
5 Réponses :
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. P>
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. P>
Par exemple, le code suivant: p> ref: http: / /www.cplusplus.com/doc/Tutorial/opérateurs / P> P>
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 code> aura définitivement exécuté avant
B + 2 code > commence (au moins du point de vue du comportement observable).
exactement. Dans ce cas, A = 5, B = 3.
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 ) ...
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 code>, 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.)
Ça s'appelle l'opérateur des virgules: dans une expression 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é.) p> 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: p> (voir. Je vous ai dit que c'était bon pour l'obfuscation.) P> p> x, y code>, le compilateur
d'abord évalue
x code> (y compris tous les effets secondaires), puis
y code>; les résultats
de l'expression sont les résultats de
y code>.
"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 code> boucles, par ex.
pour (; x> y; x--, y ++) ... code>
@Tonydelroy j'ai dit surtout i>. Je ne suis pas sûr que je ne préférerais pas un pendant code> 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 code> à un type donné, donc qu'il peut être utilisé dans un opérateur ternaire.
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!