51 votes

Avertissement du compilateur - suggérer des parenthèses autour de l'affectation utilisée comme valeur de vérité

Lorsque j'essaie de compiler le morceau de code ci-dessous, j'obtiens cet avertissement :

warning: suggest parentheses around assignment used as truth value

Pourquoi cela se produit-il ? Il s'agit d'une expression idiomatique assez courante, je crois. J'ai même utilisé quelque chose comme cela plus tôt dans mon code.

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

    return NULL;
}

81voto

Erik Points 38942

Soyez explicite - le compilateur ne vous avertira pas que vous avez peut-être fait 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 faire faire cette erreur ;)

60voto

geekosaur Points 26170

Si cette expression idiomatique est courante, il est encore plus courant d'utiliser = alors qu'ils veulent dire == . La convention quand il s'agit vraiment de la = est d'utiliser une couche supplémentaire de parenthèses :

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

21voto

Carl Norum Points 114072

Il s'agit simplement d'un avertissement de sécurité. Il s'agit d'une expression idiomatique relativement courante, mais aussi d'une erreur relativement fréquente lorsque l'on veut dire "avoir". == là-dedans. Vous pouvez faire disparaître l'avertissement en ajoutant une autre série de parenthèses :

while ((list = list->next))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X