Предупреждение компилятора - предложите скобки вокруг присваивания, используемого в качестве значения истинности - PullRequest
40 голосов
/ 29 марта 2011

Когда я пытаюсь скомпилировать фрагмент кода ниже, я получаю это предупреждение:

warning: suggest parentheses around assignment used as truth value

Почему это происходит?Я считаю, что это довольно распространенная идиома.Я даже использую что-то подобное ранее в своем коде.

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

    return NULL;
}

Ответы [ 3 ]

62 голосов
/ 29 марта 2011

Будьте явными - тогда компилятор не предупредит, что вы, возможно, допустили ошибку.

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

или

while ( (list = list->next) )

Когда-нибудь вы будете рады, что компилятор сказал вамлюди делают совершают эту ошибку;)

51 голосов
/ 29 марта 2011

Хотя эта конкретная идиома встречается часто, люди чаще используют =, когда они означают ==.Соглашение, когда вы действительно имеете в виду =, заключается в использовании дополнительного слоя скобок:

while ((list = list->next)) { // yes, it's an assignment
19 голосов
/ 29 марта 2011

Это просто предупреждение о безопасности.Это довольно распространенная идиома, но также и довольно распространенная ошибка, если вы предполагали, что там будет ==.Вы можете убрать предупреждение, добавив еще один набор скобок:

while ((list = list->next))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...