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

问题描述 投票:0回答:4

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

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;
}
c compiler-construction compiler-warnings
4个回答
94
投票

明确 - 这样编译器就不会警告您可能犯了错误。

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

while ( (list = list->next) )

有一天你会很高兴编译器告诉你,人们确实会犯这个错误;)


66
投票

虽然这种特定的习语很常见,但更常见的是人们在表示

=
时使用
==
。 当您真正指的是
=
时,惯例是使用额外的括号:

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

24
投票

这只是一个“安全”警告。 这是一个相对常见的习语,但当你想要在那里有

==
时,也是一个相对常见的错误。您可以通过添加另一组括号来消除警告:

while ((list = list->next))

0
投票

此错误也可能发生在 if(x = 10),这是错误的 if(x == 10),这是正确的

© www.soinside.com 2019 - 2024. All rights reserved.