web-dev-qa-db-ja.com

コンパイラの警告-真理値として使用される割り当てを括弧で囲むことを提案

以下のコードをコンパイルしようとすると、次の警告が表示されます。

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;
}
42
F. P.

明示的に-コンパイラは、間違いを犯した可能性があることを警告しません。

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

または

while ( (list = list->next) )

いつかあなたはコンパイラーがあなたに言ったことがうれしいでしょう、人々doその間違いを犯してください;)

64
Erik

その特定のイディオムは一般的ですが、さらに一般的なのは、=を意味するときに==を使用することです。 =を本当に意味する場合の規則は、追加の括弧層を使用することです。

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

これは単なる「安全」警告です。これは比較的一般的なイディオムですが、== そこで。別の括弧のセットを追加することにより、警告を消すことができます。

while ((list = list->next))
19
Carl Norum