Avertissement du compilateur – suggérez des parenthèses autour de l’affectation utilisée comme valeur de vérité

Lorsque j’essaie de comstackr le morceau de code ci-dessous, je reçois cet avertissement:

warning: suggest parentheses around assignment used as truth value

Pourquoi cela arrive-t-il? C’est un langage assez courant, je crois. J’utilise même quelque chose comme ça plus tôt sur mon code.

 struct PIDList* getRecordForPID(struct PIDList* list, pid_t pid) { while(list = list->next) if (list->pid == pid) return list; return NULL; } 

Soyez explicite – le compilateur ne vous avertira pas que vous avez peut-être commis une erreur.

 while ( (list = list->next) != NULL ) 

ou

 while ( (list = list->next) ) 

Un jour, vous serez heureux que le compilateur vous l’ait dit, les gens commettent cette erreur;)

Bien que cet idiome soit courant, il est encore plus courant que les gens utilisent = quand ils veulent dire == . La convention lorsque vous voulez vraiment dire que le = est d’utiliser une couche supplémentaire de parenthèses:

 while ((list = list->next)) { // yes, it's an assignment 

C’est juste un avertissement de sécurité. C’est un idiome relativement commun, mais aussi une erreur relativement commune quand vous vouliez avoir == dedans. Vous pouvez faire disparaître l’avertissement en ajoutant un autre jeu de parenthèses:

 while ((list = list->next))