2011-10-30 8 views
4

私は、0の結果はコンパイラに依存していると述べた記事に出くわしました。結果は1またはFFまたはFFFFのようになります。 C99標準6.5.3.3単項算術演算子として 論理否定はゼロ(0)コンパイラはCに依存しますか?

論理否定演算子の結果!そのオペランドの値が と0と等しくない場合は0になり、そのオペランドの値が0に等しい場合は1になります。結果はint型です。 !Eという表現は(0 == E)と等価です。

実際にコンパイラに依存していますか?

+10

1と評価されるという標準を引用していませんでしたか?したがって、プラットフォーム/コンパイラに依存しないはずです。おそらくその記事は '〜0'がプラットフォームに依存していると言うことを意図したものかもしれません。 – Shahbaz

+0

あなたはその記事をどこに見ましたか? –

答えて

10

あなたはが、それは結果がこのように0または1

でなければならないことを指定する規格から引用し、すでにあなた自身の質問に答えているように見える、およそ私が推測することができるすべては、あなたが求めているということですすべてのCコンパイラがこの点で標準に準拠しているかどうか。今まで書かれたすべてのCコンパイラを使用していないので、私は本当にそれに確実に答えることはできません。私は一度も他の価値を生み出した人は一度も使っていないと聞いたことがありません。そして、私がここで遊ぶのに費やした時間、Usenetなどで、と思われます。そのような獣が存在すれば、それを聞いたことがある。

編集:それはおそらくK & R1で、それが具体的に0または1(§A.7.2)を生成するものとして説明したということは注目に値します:

論理否定演算子の結果!そのオペランドの値が0の場合は1、そのオペランドの値がゼロでない場合は0となります。

1

各コンパイラは、その記述に従う標準のリストを持つ必要があります。 もちろん、この説明は必ずしも完全ではありません(コンパイラによっては標準のバグや誤解が含まれています)が、ブーリアンでの動作は非常に単純で古く(Cの初日から来ています)、新しいコンパイラの動作が異なります。

私はいつもこれを正式な標準として、そして事実上の標準としても得ています:(!0) = 1(!1) = 0、いずれもint型です。

しかし、C++のブール演算子ではboolの値が返されるので、C++でコンパイルすると、intではなくboolが使用されることに注意してください。しかし、boolとintは直接互換性がありますが、bool x = 10;のような何か奇妙なことをすれば、C++コンパイラによって警告されます。

関連する問題