2016-05-16 8 views
3

このコードは私をたくさん混乱:このビット単位の操作はどのように機能しますか?

bool b = 8 & 7 == 0; //b == false 
std::cout << 8 & 7; //Outputs 0 

なぜそれはそれを行うのですか?

+5

http://en.cppreference.com/w/cpp/language/予想されるwhic 0でありますoperator_precedence実際には、私は[コンパイラの警告](http://coliru.stacked-crooked.com/a/acc44965f2315b25)を取得します。 – chris

+2

誰があなたにそのようなコードを書くことを教えていますか? – SergeyA

答えて

8

http://en.cppreference.com/w/c/language/operator_precedence

==ので、あなたが得る&前/実行に評価されています

bool b = 8 & 7 == 0; //==> 

// 7==0 --> 0 
// 8 & 0 --> 0 (which is 'false') 
// ==> b is false 

をあなただけの()を追加期待するものを取得するには:

bool b = (8 & 7) == 0; // will be evaluated as 'true' 
5

==&よりも優先されますので。その式は0

1

あなたの問題に等しい

(8 & (7==0)) 

されています:

8 & (7 == 0); 

ので、修正する:

8 & 7 == 0; 

がに等しいので、あなたの式は同等です角括弧を明示的に使用します:

(8 & 7) == 0; 

評価の順序がわからない場合は、常に括弧を使用してください。

0

最初の行は= 1000 8、0111 = 7ので、2行目 をcoverredされた、結果は

関連する問題