2016-05-05 12 views
2

なぜ3つの演算子< <が異なる方法で出力しますか?期待通りに他の人が...C++演算子<<(char)ですが、出力はヘキサ/ int

誰かがより多くの私にそれを説明してもらえませんしながら、

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    operator<<(cout, "Hello").operator<<('w').operator<<(endl); // Hello119 

    cout << (void *)'w' << endl; // 0x77 

    cout << 'w'; // w 

    operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow !!! 
} 

2つの引数を持つ最初のオペレータ< <は、文字列の右出力を与えますか?


さらに詳しい情報:

cout << "Hello" << 'w' << endl;があると解釈されるだろう...

operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow

+1

この出力のどの部分が予期しないものですか? [asciiテーブル](http://www.asciitable.com/)を見ると、 '' w ''の10進数表現と16進表現が分かります。 – NathanOliver

+0

'.operator <<()'メンバ関数の連鎖呼び出しでは、通常のように '<< 'を連鎖するのと同じ出力が得られます。 – Thi

+0

私はそれを理解しました...これは動作します: 'operator <<(operator <<(cout、" Hello ")、 'w')。operator <<(endl); // Hellow' – Thi

答えて

5

したがって、あなたがvoidポインタに強制的にキャストを行っているとstd::ostream& operator<<(std::ostream&,void*);のための専門があります小数点ではなく16進数の値を出力します。

注:0x77 == 119

にも注意してください:

をあなたがここにstd::ostream::operator<<()メンバ演算子オーバーロードを呼び出している:

operator<<(cout, "Hello").operator<<('w').operator<<(endl); 
// ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ 
// |       | 
// |       + Calls the std::ostream::operator<<() member operator 
// + Calls the std::ostream& operator(std::ostream, T) global overload 

charには過負荷がintへの暗黙的な変換は、したがって、ありません出力に数値119が表示されます。 std::ostream::operator<<()メンバ関数の上記のリンク参照からも

enter image description here あなたはコメント

std::cout << 'w' << 'w' << 'w' << std::endl;  

で述べたように、グローバルなstd::ostream& operator<<(std:: ostream&, T)過負荷のチェーン呼び出しに推測されます。

operator<<(operator<<(operator<<(operator<<(std::cout,'w'),'w'),'w'),std::endl);  
+0

なぜ '.operator( 'w')'が 'char'の代わりに' int'を出力するのか答えが見つからない – Slava

+0

@Slava 'char'は暗黙的に' int'にキャストできるのでです。 –

+0

なぜ、それがオーバーロードされた関数を呼び出す代わりにキャストしたのですか?それは 'char'を受け入れる' char'を受け取る ' – Slava

関連する問題