L'opérateur virgule :
- a la plus faible priorité
- est gauche-associatif
Une version par défaut de l'opérateur virgule est définie pour tous les types (intégrés et personnalisés), et elle fonctionne de la manière suivante - donnée exprA , exprB
:
-
exprA
est évalué
- le résultat de
exprA
est ignoré
-
exprB
est évalué
- le résultat de
exprB
est retourné comme résultat de l'expression entière
Avec la plupart des opérateurs, le compilateur est autorisé à choisir l'ordre d'exécution et il est même tenu de sauter l'exécution quelle qu'elle soit si elle n'affecte pas le résultat final (par ex. false && foo()
sautera l'appel à foo
). Ce n'est cependant pas le cas pour l'opérateur virgule et les étapes ci-dessus se produiront toujours. * .
En pratique, l'opérateur virgule par défaut fonctionne presque de la même manière qu'un point-virgule. La différence réside dans le fait que deux expressions séparées par un point-virgule forment deux déclarations distinctes, tandis que la séparation par des virgules les conserve comme une seule expression. C'est pourquoi l'opérateur virgule est parfois utilisé dans les scénarios suivants :
- La syntaxe C nécessite un simple expression et non une déclaration, par exemple dans
if( HERE )
- La syntaxe C ne requiert qu'une seule déclaration, pas plus, par exemple dans l'initialisation de la fonction
for
boucle for ( HERE ; ; )
- Lorsque vous voulez éviter les accolades et conserver une seule déclaration :
if (foo) HERE ;
(s'il vous plaît, ne faites pas ça, c'est vraiment moche !)
Lorsqu'une déclaration n'est pas une expression, le point-virgule ne peut pas être remplacé par une virgule. Par exemple, ceux-ci ne sont pas autorisés :
-
(foo, if (foo) bar)
( if
n'est pas une expression)
- int x, int y (la déclaration de la variable n'est pas une expression)
Dans votre cas, nous avons :
-
a=b, c;
équivalent à a=b; c;
en supposant que a
est d'un type qui ne surcharge pas l'opérateur virgule.
-
a = b, c = d;
équivalent à a=b; c=d;
en supposant que a
est d'un type qui ne surcharge pas l'opérateur virgule.
Notez que toutes les virgules ne sont pas nécessairement des opérateurs de virgule. Certaines virgules ont une signification complètement différente :
-
int a, b;
--- la liste des déclarations de variables est séparée par des virgules, mais ce ne sont pas des opérateurs de virgule
-
int a=5, b=3;
--- il s'agit également d'une liste de déclarations de variables séparées par des virgules
-
foo(x,y)
--- liste d'arguments séparés par des virgules. En fait, x
y y
peut être évaluée dans cualquier commander !
-
FOO(x,y)
--- liste d'arguments de macro séparés par des virgules
-
foo<a,b>
--- liste d'arguments de modèle séparés par des virgules
-
int foo(int a, int b)
--- liste de paramètres séparés par des virgules
-
Foo::Foo() : a(5), b(3) {}
--- liste d'initialisateurs séparés par des virgules dans un constructeur de classe
* Ce n'est pas tout à fait vrai si vous appliquez des optimisations. Si le compilateur reconnaît qu'un certain morceau de code n'a absolument aucun impact sur le reste, il supprimera les instructions inutiles.
Pour en savoir plus : http://en.wikipedia.org/wiki/Comma_operator
0 votes
Pour en savoir plus, cliquez ici. stackoverflow.com/questions/12824378/
1 votes
Duplicata possible de Que fait l'opérateur virgule `,` en C ? . Il vous a devancé d'un jour. Et la réponse de lillq permet de répondre à la question sur
a = (b, c);
.5 votes
Mais dans ce cas
a = b, c = d;
a effectivement les mêmes performances que celles prévuesa = b; c = d;
?0 votes
@NargothBond Pas nécessairement. Si
b
yd
sont des évaluations de fonctions qui utilisent (et modifient) un état commun, l'ordre d'exécution n'est pas défini jusqu'à ce que l'ordre d'exécution de la fonction soit modifié.C++17
.