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

F. *_* P. 43 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;
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*rik 66

明确 - 然后编译器不会警告您可能犯了错误.

while ( (list = list->next) != NULL )
Run Code Online (Sandbox Code Playgroud)

要么

while ( (list = list->next) )
Run Code Online (Sandbox Code Playgroud)

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

  • @jpaugh 这就是所谓的尤达条件。它有一个维基百科页面:) (3认同)

gee*_*aur 54

虽然这个特定的成语很常见,但更常见的是人们=在他们的意思时使用==.你真正的意思=是使用一个额外的括号层:

while ((list = list->next)) { // yes, it's an assignment
Run Code Online (Sandbox Code Playgroud)


Car*_*rum 20

这只是一个"安全"警告.这是一个相对常见的习语,但当你打算==在那里时也是一个相对常见的错误.您可以通过添加另一组括号来消除警告:

while ((list = list->next))
Run Code Online (Sandbox Code Playgroud)