89 votes

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

Ceci (notez l' 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 3 .

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

147voto

songyuanyao Points 2265

En fonction de la Priorité de l'Opérateur, opérateur virgule a priorité moins élevée operator=, alors x = 2,3; est équivalent à (x = 2),3;. (La priorité de l'opérateur détermine la façon dont l'opérateur sera tenu de ses arguments, plus serré ou plus lâche que les autres opérateurs en fonction de leurs priorités.)

Notez la virgule expression est - (x = 2),3 d'ici, pas 2,3. x = 2 est évalué dans un premier temps (et de ses effets secondaires), puis le résultat est plus d'actualité, 3 est évalué (il ne fait rien en fait). C'est pourquoi la valeur de l' x est 2. Notez que 3 est le résultat de l'ensemble de la virgule expression (c - x = 2,3), il ne sera pas utilisé pour attribuer à l' x. (Changer en x = (2,3);, x sera attribué avec 3.)

Pour return 2,3;, la virgule expression est - 2,3, 2 est évaluée alors que son résultat est mis au rebut, et puis, 3 évalué et est retourné à la suite de l'ensemble de la virgule expression, qui est renvoyée par l' instruction de retour plus tard.


Plus d'informations sur les Expressions et les 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 l'expression de l'énoncé, x = 2,3 est l'expression ici.

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

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

return 2,3; est instruction de saut (return), 2,3 est l'expression ici.

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

32voto

Bathsheba Points 23209

L'opérateur virgule (également appelé séparation des expressions ) est évalué de gauche à droite. Ainsi, return 2,3; est équivalent à return 3; .

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

20voto

Biagio Festa Points 4698

Cette instruction:

  x = 2,3;

il est composé par deux expressions:

> x = 2
> 3

Puisque la priorité de l'opérateur, = a plus de priorité supérieure à virgule ,, alors x = 2 est évaluée et après 3. Ensuite, x sera égal à 2.


Dans l' return à la place:

int f(){ return 2,3; }

La syntaxe de la langue est :

return <expression>

Note return ne fait pas partie de l'expression.

Donc, dans ce cas, les deux expression sera évaluée sera:

> 2
> 3

Mais seule la deuxième (3) sera retourné.

2voto

Luciano Points 515

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

( x = 2 ), 3;

return ( 2, 3 );

Nous pouvons maintenant voir que l'opérateur binaire "," fonctionne de la même manière sur les deux, de gauche à droite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X