以下のコードをコンパイルしようとすると、次の警告が表示されます。
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;
}
明示的に-コンパイラは、間違いを犯した可能性があることを警告しません。
while ( (list = list->next) != NULL )
または
while ( (list = list->next) )
いつかあなたはコンパイラーがあなたに言ったことがうれしいでしょう、人々doその間違いを犯してください;)
その特定のイディオムは一般的ですが、さらに一般的なのは、=
を意味するときに==
を使用することです。 =
を本当に意味する場合の規則は、追加の括弧層を使用することです。
while ((list = list->next)) { // yes, it's an assignment
これは単なる「安全」警告です。これは比較的一般的なイディオムですが、==
そこで。別の括弧のセットを追加することにより、警告を消すことができます。
while ((list = list->next))