2016-11-30 2 views
0

の値を返すには、私はC++初心者だ、と私は入力が成功した場合アドレスとCIN

int a; 
if(cin>>a); 

のようなコードでは、CINは真とその逆をもたらすだろうと言われました。
しかし、私はbool値を出力したい、

cout<<boolalpha<<(cin>>a)<<endl; 

それはアドレス与える:

0x6fcc41e8 

を私もcinが対象ですが、

cout<<&cin<<endl; 

が与えると言われました値

0x6fcc41e0 

これは8で異なる。
a。なぜ最初のcoutがbool値ではなくアドレスを与えるのですか?
b。なぜ2つのcoutが異なるアドレスを与えるのですか?
ありがとうございます。

+0

使用しているコンパイラとコンパイラのフラグは何ですか? – aschepler

+3

誰かがあなたを惑わしました。 'cin'は' istream'で、 '>>'演算子は' istream& 'を返します。詳細はこちら[こちら](http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/) – CAB

答えて

4

;(値であるか、またはNULL否かのみ関連する。void *への変換の正確な値は無関係であることに注意してください)。 C++ 11、std::istreamまで

std::istreamからvoid*への暗黙の変換があったことを意味し、変換機能operator void*() const;を持っていました。ポインタの実際の値は意味がありませんでした。ただし、null値は失敗が発生したことを意味し、null以外の値は成功を意味しました。これにより、if (cin >> a)のようなものが正しく動作することができました。

プレC++ 11コンパイラまたはコンパイラの設定を使用しているように見えるので、出力しようとすると無意味なvoid*の値が得られます。 C++ 11では

以降、std::istreamではなくstd::istreamからboolへの有効な変換があることを意味し、変換機能explicit bool() const;を持っていますが、場合にのみ、明示的に要求しました。 ifまたはwhile数はとして明示的boolへの変換を要求するが、

cout<<boolalpha<<(cin>>a)<<endl; 

はないので、あなたのコードはC++でコンパイルし、後からではないでしょう。代わりに、

cout << boolalpha << static_cast<bool>(cin>>a) << endl; 

が必要です。

-1

boolalpha()ios_base&代わり 使用をBOOLない返す:

cout << (bool)(cin >> x) << endl; 
+0

あなたの答えは間違っています。 'boolalpha 'のポイントは' bool'が 'ostream'に書き込まれるときに1と0の代わりに" true "と" false "を出力することです。 More here:http://en.cppreference.com/w/cpp/io/manip/boolalpha OPが本当にやりたいことは、Cスタイルのキャストを保存して、 'cout << boolalpha << (bool)(cin>> a)<< endl ; ' – user4581301

1

まず、cin >> aの結果はのIStreamオブジェクトへの参照であることを確認します。

なぜ最初のcoutがbool値ではなくアドレスを与えるのですか?式はif文の状態で使用できるようにはistreamオブジェクトは「BOOLするimplictlyコンバーチブル」でなければならないからである

。 C++ 11以前では、コンパイラは通常、istreamをvoid *に変換することを許可していました。 cin >> aの結果を<<演算子を介してcoutに渡すと、この変換がvoid *に選択され、返されるアドレスがすべて出力されます。

なぜ2つの詐欺師が異なる住所を与えるのですか?コンパイラはそれがvoid *に変換するとき&cinされていないいくつかのアドレスを返すことを選んだためである

。ストリームオブジェクトcinを返しcin >> a