3

私は自分のコードの一部でしばらく苦労してきましたが、最終的に問題は単純なテストにあり、期待した結果が得られないことがわかりました。

if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true

私が理解していないのは、2 行目の結果が false になる理由です。私の理解では、ゼロ以外のすべての整数はテストで真と見なされました。

4

4 に答える 4

13

との間のビット単位2のandtrueは false であるためです。

&(ビット演算子) は (論理演算子) とは異なり&&ます。

trueキャスト先int1

どちらが間違っているかはそう2 & trueです-なぜなら. (ビットは異なる場合があります)2 & 10000000000000010 & 0000000000000001 == 0

一方bool(2) == 1、 と1 & 1trueです。

于 2012-06-22T13:32:08.990 に答える
4
if (2) //=> true

ここまでは順調ですね。

if (2 & true) //=> false

はビット単位の演算子であり、2 と 1 はそれぞれバイナリで 00000010 と 00000001 である2 & 1 == 0ため、ここでの条件は に評価されます。&

if (bool(2) & true) //=> true

興味深いことに、私のコンパイラでは、このような場合に異常な動作を思い出すようです。そして、宗派の場合。C++11 標準の 4.12 はこの問題に対処していますが、私には理解できない方法で対処しています。コンパイラーの let を見たことを思い出すようですがbool(2) == 2、これは予想外でした。これが私のコンパイラのバグなのか、私の記憶の誤りなのか、私にはわかりません。

ただし&&、ビットごとの演算子ではなく論理演算子が必要だと思います&

クイズ

理解度を確認するには、

if (3 & true) //=> true

なぜだか分かりますか?(ヒント: 3 のバイナリ表現は 00000011 です。)

于 2012-06-22T13:43:23.013 に答える
3

&&の代わりにが必要です&

&&はブールand演算子&ですが、 はバイナリ 'and' なので、 whileと2 & true同じです。0010 & 0001 = 0000 -> false2 && true = true

于 2012-06-22T13:32:22.257 に答える
1

&すべてのビット間で AND を実行します (ビットごとの AND を呼び出します) 。必要なのは&&演算子 (ブール AND) です。

バイナリの 2 は '10' で、 true はバイナリの 1 (01) である10 & 01ため、結果は 0 になります。

bool(2) は 2 を true に変換し、バイナリでは 01 であり、01 & 0101 です。

于 2012-06-22T13:34:35.267 に答える