Подтвердить что ты не робот

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

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

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;
}

Спасибо

EDIT: Спасибо за ваши ответы. Все они очень похожи, поэтому я буду принимать случайный вариант, обновив страницу и нажав на верхнюю часть :P

4b9b3361

Ответ 1

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

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

или

while ( (list = list->next) )

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

Ответ 2

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

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

Ответ 3

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

while ((list = list->next))