2016-05-08 5 views
0

Considérons le code:opérateur Comma utilisé dans l'attribution

int i, j; 
i = (i = 1, j = 3); 
i++; 
cout<<i<<" "<<j; 

Cet imprimé 4 3 (C++ 14). J'ai lu que l'opérateur virgule évalue l'expression sur sa gauche et renvoie celle sur sa droite. Maintenant, si cela est correct, je veux savoir quelle est la valeur de retour de j = 3? Est-ce la valeur? Ou une référence à la lvalue?

Comment cela fonctionne-t-il réellement?

+0

Je suis désolé pour les 3 lignes supplémentaires, mais il y a une limite de mot minimum qui ne devrait probablement pas s'appliquer dans ce cas, car je crois que ma question est assez claire. –

Répondre

0

L'opérateur d'affectation renvoie une lvalue se référant à l'opérande de gauche. Il groupe de droite à gauche. ([expr.ass]). Notez qu'indiquer une référence à la lvalue n'a pas de sens - elle renvoie une lvalue ou non. L'opérateur virgule effectue les calculs de valeur et les effets de bord à partir de l'opérande de gauche, les supprime et fait de même pour l'opérande de droite. ([expr.comma])

Alors refactorisation l'opérateur virgule produirait le code équivalent suivant:

i = 1;  // left operand, value discarded 
i = j = 3; // right operand, value preserved 
i++; 

et refactorisation alors l'affectation de composé produirait le code suivant toujours équivalent:

i = 1; 
j = 3;  // rightmost assignment 
i = j;  // leftmost assignment 
i++; 
2

Pour calculer (i = 1, j = 3), il calcule, de gauche à droite, les expressions séparées par des virgules, et renvoie la valeur de la dernière expression (la plus à droite). Donc, il calcule i = 1 (i devient 1), puis il calcule j = 3 (j devient 3), puis renvoie 3.

Après avoir calculé (i = 1, j = 3), qui a retourné 3, il effectue l'affectation, que je fixe à 3.

Puis i ++ est calculé, que j'ensembles à 4.

Puis i et j sont imprimés.

2

Je veux savoir quelle est la valeur de retour de j = 3?

Opérations d'assignation * return (ou "evaluate to") une référence à la partie gauche de l'opération, dans ce cas j.

donc i = (i = 1, j = 3); est identique à:

i = 1; 
j = 3; 
i = j; 

* Pour les types intégrés qui est. Les surcharges personnalisées operator= peuvent renvoyer ce qu'elles veulent, bien qu'il soit recommandé de renvoyer une référence à *this car il s'agit du comportement attendu parmi les programmeurs C++.

+0

donc si j'incrémente i par 1 alors cela signifie que j devrait aussi être incrémenté puisque vous avez dit qu'il renvoie une ** référence **! donc la ligne 3 devrait lire i = & j ;? –

+0

@SaurabhRaje Renvoie une référence mais la valeur référencée est __copiée__ à "i" (puisque "i" n'est pas une variable de référence). De plus, ne confondez pas '& variable' avec' type & ', le premier est l'opérateur address-of, le dernier déclare un type de référence. – emlai

+0

oui, je suis conscient de la différence, mais je pensais que le compilateur pourrait implicitement taper le cast à une référence puisque je donne ia mémoire adresse .... c'est juste une supposition, je pourrais être horriblement mal –