编译器警告 - 建议用作真值的赋值括号

时间:2011-03-29 17:52:26

标签: c compiler-construction compiler-warnings

当我尝试编译下面的代码时,我收到了这个警告:

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 个答案:

答案 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))
相关问题