2011-12-30 6 views
5

なぜ、最初のものがpbf_ [k]を正しくインクリメントできるのですが、2番目のものは1回もインクリメント(インクリメント)しないのですか?これらの2つのC++コードブロックの違いは何ですか?

unsigned pbf_[5] ={0}; 
bool m=0; 

コード1:

for(int k=0;k<5;k++)  
{ 

    if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)  
    pbf_[k]++; 
    } 

はコード2:

for(int k=0;k<5;k++)  
{ 
    if((bit_table_[k][i][bit_index ] & bit_mask[bit])==true) 
     pbf_[k]++; 
} 
+0

それぞれの繰り返しとその後ろのMの値を確認してください。違いがわかるはずです... –

答えて

7

最初のケースでは、マスキングの結果は真と比較される前にブールmに変換されます。

2番目のケースでは、ビットマスクが整数型であると思います。その場合、trueは同じ整数型に昇格されます(値は1です)。

== trueを比較対象から除外するだけで同等の効果が得られます。

+3

@ Johnが認識しない場合、 '&'は論理積ではなくビット単位のANDであるため、結果は整数です。ブール値の文脈で評価される非ゼロの整数は真ですが、整数*が1であることはtrue *の値と等しくありません。 –

+0

これを修正する別の方法は、明示的なキャストを 'bool'に使うことです。しかし、これは愚かです。なぜなら、「真」と比較すると、最初は愚かです。 「それは本当です」というフレーズが英語ではほとんど常に不必要であるのと同じように、 '== true'はほとんど常にプログラミングに余計です。 –

0

秒だけテストしながら、上の第一は、bit_table_[k][i][bit_index ] & bit_mask[bit]の値のMへの割り当ての結果をテスト可否

bit_table_[k][i][bit_index ] & bit_mask[bit]結果0

最初の結果が各反復でmに記録される点を除いて、同じ効果です。あなたが最初の

if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true) 

をチェック

+1

いいえ、彼らは同じ効果がありません、そして、第二のテストのあなたの記述は、私が間違っていると信じています。ボ・ペルソンの答えを見てください。 – Mat

0

は、変数mにいくつかの値をassiningされ、真ならばそれはで使用されています。

0

あなたのコードに1つの問題が見つかりました。 &の代わりに& &を使用する必要があります。 比較すると、& &は論理演算子であり、& - ビット演算子とは異なります。

例:

((M =(bit_table_ [K] [I] [bit_index] & & bit_mask [ビット]))== TRUE)

もしCでオペレータ学ぶ++ことができます

+0

いいえ、特定のビットが両方の値に設定されていることを確認する必要があるため、ビット演算子が必要です。しかし、結果を 'true'と比較する必要はありません。なぜなら、これは' 1'との比較に相当します。なぜなら、それは "match"でも他の非ゼロ値かもしれないからです。 @BoPerssonは正しい。 –

関連する問題