Según la C FAQ :
Précisément, la signification de l'opérateur virgule dans l'expression générale
e1 , e2
est "évaluer la sous-expression e1, puis évaluer e2 ; la valeur de l'expression est la valeur de e2". Par conséquent, e1 a intérêt à impliquer une affectation ou un incrément ++ ou un décrément -- ou un appel de fonction ou un autre type d'effet secondaire, car sinon il calculerait une valeur qui serait rejetée.
Je suis donc d'accord avec vous, il n'y a aucun intérêt si ce n'est pour illustrer que c'est une syntaxe valide, si ce n'est que ça.
Si vous vouliez renvoyer les deux valeurs en C ou en C++, vous pourriez créer un objet struct
contenant x
y y
et renvoie la structure à la place :
struct point {int x; int y;};
Vous pouvez ensuite définir un type et une fonction d'aide pour vous permettre de renvoyer facilement les deux valeurs dans la fonction struct
:
typedef struct point Point;
Point point(int xx, int yy){
Point p;
p.x = xx;
p.y = yy;
return p;
}
Puis modifiez votre code original pour utiliser la fonction d'aide :
Point foo(){
int x=0;
int y=20;
return point(x,y); // x and y are both returned
}
Et enfin, vous pouvez l'essayer :
Point p = foo();
printf("%d, %d\n", p.x, p.y);
Cet exemple se compile à la fois en C et en C++. Bien que, comme Mark le suggère ci-dessous, en C++, vous pouvez définir un constructeur pour l'objet point
qui offre une solution plus élégante.
Soit dit en passant, la possibilité de renvoyer directement plusieurs valeurs est merveilleuse dans les langages tels que Python qui la prennent en charge :
def foo():
x = 0
y = 20
return x,y # Returns a tuple containing both x and y
>>> foo()
(0, 20)