Ответ 1
Быть явным - тогда компилятор не предупредит, что вы допустили ошибку.
while ( (list = list->next) != NULL )
или
while ( (list = list->next) )
Когда-нибудь вы будете рады, что компилятор сказал вам, люди делают эту ошибку;)
Когда я пытаюсь скомпилировать часть кода ниже, я получаю это предупреждение:
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
Быть явным - тогда компилятор не предупредит, что вы допустили ошибку.
while ( (list = list->next) != NULL )
или
while ( (list = list->next) )
Когда-нибудь вы будете рады, что компилятор сказал вам, люди делают эту ошибку;)
В то время как эта особая идиома распространена, более распространенным является то, что люди используют =
, когда они означают ==
. Соглашением, когда вы действительно имеете в виду =
, является использование дополнительного слоя круглых скобок:
while ((list = list->next)) { // yes, it an assignment
Это просто предупреждение о безопасности. Это относительно распространенная идиома, но также относительно распространенная ошибка, когда вы хотели иметь ==
. Вы можете отключить предупреждение, добавив еще один набор круглых скобок:
while ((list = list->next))