Pourquoi ne mettre des parenthèses autour d'une liste de valeurs séparées par des virgules modifier l'affectation? [dupliquer]
Cette question a déjà une réponse ici:
- qu'est-ce qu'une liste de valeurs séparées par une virgule, entre parenthèses, signifie en C? un = (1, 2, 3); [doublon] 6 réponses
- Comment fonctionne L'opérateur virgule 9 réponses
s'il vous Plaît envisager de code suivant,
int i;
i = 1,2,3,4,5;
printf("First time i = %dn",i);
i = (1,2,3,4,5);
printf("Second time i = %dn",i);
Sortie:
première fois i = 1
deuxième fois i = 5
Pourquoi les parenthèses faire de l'opérateur virgule dernière valeur et sans parenthèses, il prend la première valeur?
Merci d'avance.
4 réponses
Premier est équivalent à (i = 1),2,3,4,5;
ce qui veut dire que les virgules n'ont pas d'effet. Lorsqu'il est utilisé avec des parenthèses, il renvoie la dernière valeur de la "liste délimitée par une virgule"
tout cela est dû à la priorité de l'opérateur, que vous pouvez voir une table à propos de ici
ceci est dû à la la priorité de l'opérateur et l'ordre d'évaluation. =
lie plus difficile que ,
et à partir de cela nous pouvons comprendre que les deux expressions ci-dessous sont les mêmes:
i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)
note:opérateur virgule est l'opérateur "le plus faible" de tous
Pourquoi opérateur virgule rendement de la dernière valeur de notre liste?
Pour faire simple cet opérateur n'évalue la première opérande que pour la jeter et passer à la suivante, elle se lie de gauche à droite ce qui signifie qu'il part de la gauche et continue de marcher vers la droite.
Où puis-je en savoir plus sur ce sujet?
Parce que =
a une priorité plus élevée que ,
(qui a le plus bas), le premier est le même que
(i = 1),2,3,4,5;
qui attribue 1
i
(i = 1
) puis évaluer les expressions 2
,3
,4
et 5
par l'intermédiaire des opérateurs de virgule (Toute l'expression aboutit en fait à 5
, qui n'est pas utilisée). Dans la seconde,
(1,2,3,4,5)
est mis entre parenthèses, donc il sera d'abord évalué avant =
. Il en résulte 5
(l'expression la plus à droite; c'est le comportement de l'opérateur virgule) Qui est alors assigné à i
.
i = (1,2,3,4,5);
| |
\---------\--- results in 5 then is assigned to i
L'assignation a une priorité plus élevée que la virgule , d'où le résultat obtenu dans le premier cas. Vous pouvez trouver l'ensemble des opérateur tableau de priorité ici .
pourquoi la parenthèse fait l'opérateur virgule pour prendre la dernière valeur et sans la parenthèse il prend la première valeur?
parce que la parenthèse est utilisée pour outrepasser la préséance. Le premier cas est implicitement équivalent à :
(i = 1),2,3,4,5;
Virgule évalue à partir de la gauche à droite et la valeur la plus à droite est la valeur de l'expression entière. Lire le documentation ici.
l'opérateur virgule a une associativité de gauche à droite. Deux expressions séparées par une virgule sont évaluées de gauche à droite. L'opérande de gauche est toujours évalué, et tous les effets secondaires sont terminées avant l'opérande de droite est évaluée.