当我尝试编译下面的代码时,我收到了这个警告:
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;
}
答案 0 :(得分:62)
明确 - 然后编译器不会警告你可能犯了错误。
while ( (list = list->next) != NULL )
或
while ( (list = list->next) )
有一天,你会很高兴编译告诉你,人们做犯了错误;)
答案 1 :(得分:51)
虽然这个特定习惯用法很常见,但更常见的是人们=
表示==
。真正意味着=
的惯例是使用额外的括号层:
while ((list = list->next)) { // yes, it's an assignment
答案 2 :(得分:19)
这只是一个'安全'警告。这是一个相对常见的习惯用语,但当你想要==
时,这也是一个相对常见的错误。您可以通过添加另一组括号来消除警告:
while ((list = list->next))