web-dev-qa-db-fra.com

Pourquoi la valeur de retour de la fonction fun est-elle 8 au lieu de 7?

En référence à arguments de retour séparés par des virgules dans la fonction C [duplicate] ,

x=x+2,x+1;

sera évalué comme

x=x+2; 

Cependant, dans le cas du code suivant

#include<stdlib.h>
#include<stdio.h>

int fun(int x)
{
    return (x=x+2,x+1); //[A]
}

int main()
{
   int x=5;
   x=fun(x);
   printf("%d",x); // Output is 8
}

Ne doit pas aligner [A], être évalué comme

x=x+2;

donnant x = 7

35
Ashish Kumar

L'instruction return (x = x + 2, x + 1); est équivalente à:

x = x + 2; // x == 7
return x + 1; // returns 8
56
Nathan Xabedi

Lors de l'écriture de return (x=x+2,x+1), la première expression est évaluée en premier, donc x=x+2 Est évalué, ce qui fait que x est égal à 7 comme effet secondaire. Ensuite, la deuxième expression est évaluée et renvoyée, d'où la fonction renvoie x + 1 donc retourne 8.

Si vous aviez écrit return (x+2,x+1);, le résultat aurait été 6 car la première expression x+2 N'a aucun effet secondaire.

15
Corentin Pane

Les deux parties du return sont évaluées respectivement et le résultat de la dernière instruction est retourné:

Au début, nous avons:

x = x + 2 // 7

Maintenant, x est mis à jour vers 7 avant la deuxième évaluation qui donne:

x + 1 // 7 + 1 = 8

et enfin retourner 8.

Pour une meilleure compréhension, considérons le cas de la variable intermédiaire comme suit:

return (y = x + 2, y + 1);
12
XBlueCode

L'assurance qualité que vous reliez facilement aux États

L'opérateur virgule évalue une série d'expressions. La valeur du groupe de virgules est la valeur du dernier élément de la liste.

donc la valeur de

x+2,x+1;

est x+1 et il n'y a pas d'effets secondaires.


Exemple de code:

#include<stdio.h>
int main(int argc, char * argv){
    int x;
    x = 0;
    x = (x+2, x+1);
    printf("%d\n", x);
    return 0;
}

résulte en 1 lors de l'exécution.


Cependant, lorsque vous faites

return (x=x+2, x+1)

vous avez un effet secondaire: x est incrémenté de deux en premier, puis x est incrémenté de 1 et le résultat est renvoyé.

6
lucidbrot

C'est une question de priorité de l'opérateur.

x=x+2,x+1 Est évalué comme (x=x+2), (x+1) Et non comme x=(x+2,x+1)

3
RiaD

Comme d'autres utilisateurs l'ont indiqué, le flux de commandes va de gauche à droite, et dans le cas de return, il restituera la valeur dans l'opérateur le plus à droite. Ce qui est écrit avant cet opérateur et séparé par des virgules n'est pas différent des expressions écrites en ligne. Exemple:

return (x = x + 2, x = x - 5, x + 1);

Le code ci-dessous produit le même résultat:

x = x + 2;  
x = x - 5;
return x + 1;

Pour x = 0, cela retournerait -2. Notez que, pour les deux codes, si nous changeons x = x - 5 à x - 5, c'est-à-dire que nous soustrayons 5 de x mais sans enregistrer son résultat nulle part, la valeur de retour de x deviendra 3 et, par conséquent, confirmant l'équivalence.

3
Egodev

L'opérateur virgule introduit un point de séquence dans votre code. Les déclarations sont évaluées dans cet ordre:

  1. x = x + 2, auquel point le x local dans fun est 7.

  2. x + 1, qui est évalué à 8 et est renvoyé.

Pour clarifier, voici une version entre parenthèses montrant la priorité des opérateurs:

return (x=x+2),x+1;

L'expression de gauche est évaluée et sa valeur est jetée. La valeur de l'expression de droite correspond à ce qui est renvoyé.

0
S.S. Anne