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

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

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 ответов


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

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

или

while ( (list = list->next) )

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


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

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

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

while ((list = list->next))