L'opérateur virgule , en langage C combine deux (ou plusieurs) expressions, les évaluant l'une après l'autre de gauche à droite et retournant la valeur de la dernière expression :
int x = (f(), g()); // f() et g() sont appelées, x == résultat de g()
Il est le plus souvent utilisé dans les boucles for :
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
Quand est-il utile :
Pièges :
Question : Que va imprimer le code suivant ?
int a = 1; int b = (a = 2, a + 3); printf("%d ", b);
Réponse : Affichera "5". D'abord, a=2 est assigné, puis l'expression a+3 évalue 2+3=5, et c'est cette valeur qui sera assignée à la variable b.
Histoire
Dans un projet en C, un développeur a utilisé l'opérateur virgule sans parenthèses dans la fonction de retour :
return x++, y++;On s'attendait à ce que la fonction retourne y+1, mais en fait, return ne prend en compte que le résultat de l'expression de droite, tandis que x++ est évalué séparément. Cela a dérouté l'utilisateur car le résultat du retour était différent de ce qui était prévu.
Histoire
Dans une boucle for, un programmeur a accidentellement mis une virgule à la place d'un point-virgule :
for(i=0, i<10, i++) ...Le programme a été compilé, mais la boucle n'a été exécutée qu'une seule fois, car l'expression i<10, i++ dans les conditions for retourne toujours la valeur de la dernière expression (i++), et non la condition de continuation de la boucle.
Histoire
Lors de l'écriture de macros, l'un des développeurs a défini :
#define DO(x, y) x, y int v = DO(f(), g());Il s'attendait à ce que les deux fonctions soient appelées, mais il a oublié de mettre des parenthèses. En fin de compte, seule f() a été appelée ; la valeur de g() n'a pas été assignée à v. Utilisation correcte :
#define DO(x, y) ((x), (y)).