2013-06-17 3 views
18

私はこのC++プログラムを書いていますが、第3のcoutの文でなぜ1が印刷されているのか理解できません。bool = trueのときに補数演算子が機能しないのはなぜですか?

#include<iostream> 

using namespace std; 

int main() 
{ 
    bool b = false; 
    cout << b << "\n"; // Print 0 
    b = ~b; 
    cout << b << "\n"; // Print 1 
    b = ~b; 
    cout << b << "\n"; // Print 1 **Why?** 
    return 0; 
} 

出力:

b = !b; 

論理否定である:それは

0 
1 
0 
+6

なぜ誰かが投票に同意したのか分かりません。 – vikiiii

+1

+1 @vikiiii - 残念ながら、downvotingとクローズアップの議決は、スタックエクスチェンジの弱点です。匿名のやり方で起こるからです。 – Sabuncu

+1

あなたは基本的に間違った演算子を使い、なぜあなたが期待したものではないのだろうかと疑問に思っていますか? – szx

答えて

24

これは、Cのレガシー演算子の機械化によるものです(これはまた、~ビットのの補数であることを思い出しています)。 ~への整数オペランドは、操作を実行する前に整数に昇格され、次にboolに変換されます。だからあなたが得ているものは(符号なし32ビット表現を使用して)false - >0 - >0xFFFFFFFF - >trueです。次にtrue - >1 - >0xFFFFFFFE - >1 - >trueです。

!演算子がブール値を反転するように探しています。

+1

しかし、なぜ真偽は正しいのですか? – vikiiii

+9

falseは符号なし整数を使用して '0x0000'として表されるため、trueは何でもかまいません。 – JBL

5

を印刷していないのはなぜ

0 
1 
1 

あなたはおそらくこれをしたいです。あなたがしたのは、整数へのキャストboolのビット単位の否定です。 2回目の文b = ~b;が実行された場合、事前値btrueです。整数にキャストするとビットの補数が1となり、bool trueにキャストされます。従って、trueの値は、のままであり、の値はtrueとなる。これはCのレガシーが原因です。

2

バイナリではなく論理演算子を使用する必要があります。 ~の代わりに!を使用してください。

5

他の誰もが言っているように、補数演算子が作業を完了する前にブール値が整数に昇格しています。 〜はビット単位の演算子で、整数の各ビットを反転します。 〜を00000001に適用すると、結果は11111110になります。これを32ビット符号付き整数に適用すると、〜1に-2が与えられます。なぜあなたは混乱している場合は、バイナリコンバータを見てください。例えば:あなたの改訂の質問にhttp://www.binaryconvert.com/result_signed_int.html?decimal=045050

真の作品への虚偽上記と同じ理由で。 00000000(32ビットまで)を反転すると、11111111が得られます。これは整数で-1と信じています。ブール値を比較するときは、-not-0以外はtrueとみなされ、0のみがfalseとなります。