ProgrammationDéveloppeur C, programmeur système

Expliquez comment fonctionne l'opérateur virgule (comma operator) en langage C. Quand a-t-il du sens d'être utilisé, quelles erreurs les développeurs rencontrent-ils souvent lors de son utilisation et quels sont les effets inattendus ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Quand il est nécessaire d'écrire plusieurs expressions de manière concise, en particulier dans l'initialisation ou l'incrémentation.

Pièges :

  • La priorité de la virgule est très basse, ce qui est important dans des expressions complexes ;
  • L'utilisation hors contexte (par exemple dans return ou l'assignation) peut entraîner des résultats inattendus ;
  • L'utilisation sans parenthèses peut confondre le programmeur et le compilateur.

Question piège

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.


Exemples d'erreurs réelles


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)).