web-dev-qa-db-fra.com

Comportement différent de l'opérateur virgule en C ++ avec retour?

Ceci (notez opérateur virgule):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

sorties 2.

Cependant, si vous utilisez return avec l'opérateur virgule, ceci:

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

sorties .

Pourquoi l'opérateur virgule se comporte-t-il différemment avec return?

80
ps95

Selon la Priorité opérateur , opérateur virgule a une priorité inférieure à operator=, Donc x = 2,3; Est équivalent à (x = 2),3;. (La priorité de l'opérateur détermine comment l'opérateur sera lié à ses arguments, plus serré ou plus lâche que les autres opérateurs en fonction de leurs priorités.)

Notez que l'expression virgule est (x = 2),3 Ici, pas 2,3. x = 2 Est évalué dans un premier temps (et ses effets secondaires sont terminés), puis le résultat est rejeté, puis 3 Est évalué (il ne fait rien en fait). C'est pourquoi la valeur de x est 2. Notez que 3 Est le résultat de toute l'expression virgule (c'est-à-dire x = 2,3), Il ne sera pas utilisé pour l'assigner à x. (Modifiez-le en x = (2,3);, x sera attribué avec 3.)

Pour return 2,3;, L'expression de la virgule est 2,3, 2 Est évalué, puis son résultat est ignoré, puis 3 Est évalué et renvoyé comme résultat de la expression de virgule entière, qui est renvoyée par instruction return plus tard.


Informations supplémentaires sur Expressions et Déclarations

Une expression est une séquence d'opérateurs et de leurs opérandes, qui spécifie un calcul.

x = 2,3; Est instruction d'expression , x = 2,3 Est l'expression ici.

Une expression suivie d'un point-virgule est une déclaration.

Syntaxe: attr(optional) expression(optional) ; (1)

return 2,3; Est instruction jump ( instruction return ), 2,3 Est l'expression ici.

Syntaxe: attr(optional) return expression(optional) ; (1)

138
songyuanyao

La virgule (également connue sous le nom d'opérateur expression séparation) est évaluée de gauche à droite. Alors return 2,3; est équivalent à return 3;.

L'évaluation de x = 2,3; est (x = 2), 3; en raison de priorité de l'opérateur. L'évaluation est toujours de gauche à droite, et l'expression entier a la valeur 3 avec l'effet secondaire de x en supposant la valeur 2.

32
Bathsheba

Cette déclaration:

  x = 2,3;

est composé de deux expressions :

> x = 2
> 3

Depuis priorité de l'opérateur , = a plus de priorité que la virgule ,, alors x = 2 est évalué et après 3. x sera égal à 2.


Dans le return à la place:

int f(){ return 2,3; }

La syntaxe du langage est:

return <expression>

Remarque return ne fait pas partie de l'expression.

Donc, dans ce cas, les deux expressions seront évaluées seront:

> 2
> 3

Mais seul le second (3) sera retourné.

19
Biagio Festa

Essayez d'appliquer l'approche simpliste en soulignant simplement la priorité entre parenthèses:

( x = 2 ), 3;

return ( 2, 3 );

Maintenant, nous pouvons voir l'opérateur binaire "," fonctionner de la même manière sur les deux, de gauche à droite.

2
Luciano