Dans le langage C, les opérateurs de comparaison (==, !=, <, >, <=, >=) et d'affectation (=) diffèrent tant par leur sémantique que par leur priorité. Historiquement, les erreurs entre ces opérations ont entraîné des bogues dans les logiciels : par exemple, la confusion entre = et == devenait souvent la cause d'erreurs difficilement détectables.
Problème : La principale difficulté réside dans la priorité faible de l'opérateur d'affectation (=) par rapport aux opérateurs de comparaison. De plus, l'affectation renvoie une valeur (rvalue), ce qui permet d'écrire des expressions comme while(x = y), ce qui peut parfois entraîner des conséquences indésirables ou non évidentes.
Solution : Il est essentiel de bien distinguer == et =, de comprendre leurs priorités dans la chaîne d'expressions, d'utiliser des parenthèses et des linters pour suivre de telles erreurs. Dans des expressions complexes, toujours laisser des parenthèses pour plus de clarté.
Exemple de code :
int a = 5, b = 3; if (a = b) { // erreur : affectation, pas comparaison printf("a == b "); }
Correct :
int a = 5, b = 3; if (a == b) { printf("a == b "); }
Caractéristiques clés :
Quelle est la différence entre '==' et '=' en C, et que se passe-t-il si on les confond dans une condition ?
== est l'opérateur de comparaison, = est l'opérateur d'affectation. Si l'on utilise = au lieu de ==, la variable obtiendra la valeur affectée, et la condition vérifiera cette valeur comme booléenne. C'est une cause fréquente de bogues.
Peut-on écrire des chaînes d'affectations, par exemple a = b = c = 0 ? Que se passe-t-il alors ?
Oui, en C, l'opérateur d'affectation fonctionne de droite à gauche. D'abord, 0 sera affecté à c, ensuite cette valeur sera affectée à b, puis à a. Toutes les variables obtiendront 0.
Exemple de code :
int a, b, c; a = b = c = 0;
Pourquoi l'expression 'if (a = 0)' n'est-elle pas la même que 'if (a == 0)' ?
Dans l'expression if (a = 0), 0 est affecté à a. La condition est toujours fausse (puisque le résultat de l'affectation est 0), et non une « vérification d'égalité ». Il faut écrire if (a == 0).
Un programmeur écrit une boucle while (x = data[i]) et s'attend à ce que la condition s'exécute lorsque x est égal à zéro. En réalité, la boucle se termine uniquement lorsque data[i] vaut 0, et non pas lorsque x et data[i] coïncident.
Avantages :
Inconvénients :
Séparation stricte des expressions, comparaison et affectation explicites. Utilisation de linters pour vérifier le code.
Avantages :
Inconvénients :