web-dev-qa-db-ja.com

Cでif((x = 0))はどういう意味ですか?

どうやら、gcc/Cでは、コンパイラは

if ((x=0)){ some code }

使用されますが、

if (x=0){ some code }

が使用されると、コンパイラはコンパイルを拒否します。

2つの違いは何ですか?

注として、x==0x=0の違いは何ですか。私は、いくつかの奇妙なコードに遭遇したときのCの動作を調査しています。

29
user56220

コード的には違いはありません。

起こっているのはx=0 の代わりに x==0は、よくある間違いであり、ほとんどのコンパイラは、それを見つけたときに警告(または、エラー)を出します。括弧の追加セットは、コンパイラーをシャットダウンするための一般的なトリックです-「はい、私は本当にこれを行うつもりでした」と同等です。

48
David Given

_-Werror_がない限り、コードはコンパイルを「拒否」すべきではありません。警告を有効にしている場合は、次のように表示されます。

警告:真偽値として使用される割り当ての前後に括弧を提案します[-Wparentheses] while (*dest++ = *src++)

具体的には、 GCC docs は警告の目的について次のように述べています。

真理値が期待されるコンテキストで代入がある場合や、優先順位がよく混乱する演算子がネストされている場合など、特定のコンテキストで括弧が省略されている場合に警告します。

19
user3920237