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:

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.

18
demandé sur Chris Gregg 2013-07-15 11:10:48

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

20
répondu Rapptz 2013-07-15 07:13:37

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?

8
répondu Filip Roséen - refp 2013-07-15 07:21:12

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 1i (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

Voir opérateur priorité Wikipedia article.

5
répondu Mark Garcia 2013-07-15 07:27:29

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.

4
répondu NINCOMPOOP 2013-07-15 07:19:28