web-dev-qa-db-fra.com

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

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

warning: suggest parentheses around assignment used as truth value

Pourquoi cela arrive-t-il? C'est un idiome 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;
}
42
F. P.

Soyez explicite - alors 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 content que le compilateur vous l'ait dit, les gens do font cette erreur;)

64
Erik

Bien que cet idiome particulier soit courant, il est encore plus courant pour les gens d'utiliser = quand ils veulent dire ==. La convention quand vous entendez vraiment le = consiste à utiliser une couche supplémentaire de parenthèses:

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

C'est juste un avertissement de "sécurité". C'est un idiome relativement courant, mais aussi une erreur relativement courante lorsque vous vouliez avoir == là-dedans. Vous pouvez faire disparaître l'avertissement en ajoutant un autre jeu de parenthèses:

while ((list = list->next))
19
Carl Norum