2010-12-06 16 views
1

私はC++コードをコンパイルして実行するときに実際に何が起こっているのか理解しようとしていますが、cout << "output";という行は少し混乱しています。C++で `cout <<" output ";`を実行するとどうなりますか?

私は<<は、オペレータはビット単位のleftshift演算子であることを知っている、とy = x << 6を実行する6ビットだけ左へxシフトに起因yに値を割り当てること。

Iはまた、「< <」、ストリームに対して、挿入演算子であることを知っている、とcout << "output";を実行すると、オブジェクトcoutに文字列outputを挿入すること。私が知りたいのは何

coutが本当に文字列outputによって占められるビット数に対応する値で左にシフトされている場合、これは<<、またはのオーバーロードの一例であるかどうかです。 outputが実際に<<のオーバーロードによってcoutに挿入されている場合は、代入演算子=ではなくビット演算子が使用されていますが、これははるかに直感的でしょうか?

質問cout << "output"は、端末の画面に「出力」という語をどのように配置しますか?

+4

"私は「勘所」が左に「こんにちはワールド」の時間シフトされているのを見て、そこに止まっていました。 –

+0

'='のオーバーロードがより直感的になると思う理由は分かりません。 –

+0

coutとiostreamは標準のC++ライブラリに先行しており、非常に一般的に使用されていました。それは、いくつかの小さな違いを残して立ち往生しました。通常、オペレータに過負荷をかけて、意図したのと同じ一般的な意味を与えます。 – CashCow

答えて

7

つまり、< <演算子はで、オーバーロードされた(非常に一般的なC++機能)です。
オペレータがオーバーロードされている可能性があります。マーティン・ヨークの回答によれば、演算子はオペランドと演算子の式を解析するときにコンパイラが呼び出すメソッドです。

整数型のオペランドに適用すると、< <には、 "典型的な"ビット単位の演算子セマンティクスがあり、ストリームに適用すると "printfのような"セマンティクスがあります。

coutはostreamのオブジェクトです。そのostream::operator<<

効果的にostream :: operator < <は、(その右側の)2番目の引数の可能なタイプごとに複数回オーバーロードされます。これにより、さまざまなタイプのストリームを供給することができ、フォーマットを指定する必要はありません。この演算子は、いくつかの連鎖を可能にするostreamを返す。< <。

彼らは出力に現れるのと同じ順序で行のコードのものに示すことができます< <はostreamに演算子のために選ばれた理由はそれがあります:これはより簡単であると考えられている

cout << "Found " << nbOfCats << " cats in the " << barnName << "barn."; 

読んで、そして

printf("Found %ld cats in the %s barn.", nbOfCats, barnName); 
+0

私はprintfが読みやすいと主張します。 '<<"構文は、PHPなどで文字列連結演算子を使用するのと似ています: 'echo" blah "。$ var。" blah "。$ var2' – erjiang

+0

@erjiang:あなたに同意します。私が推測する味の物質。私は<<文字シーケンスの選択とストリームAPIの背後にある一般的な設計の歴史的な見通しを提供していました。 – mjv

1

ビット演算子が実際にこのケースで使用されていないので、これは混乱していると言うよりも起こりやすいも小さい誤差があるします。 < <がコードで見やすく見えるため、演算子のオーバーロードが使用されました。

0

端末の画面に「出力」という言葉が置かれていない場合は、まずバッファに入れます。バッファがフラッシュされると、ターミナル画面にその単語が表示されます。

2

はい、オーバーロードしています。

入力のために>>と一緒にニーモニック値(覚えやすい)と低い優先順位(ほとんどの種類の式を引数として括弧を付けずに使用できるため)が出力に使用されました。

詳細については、実際にはかなり複雑です。 C++への新規参入者を時々悩ます1つのことは、<<の過負荷のいくつかはフリースタンディング関数であり、いくつかの非静的メンバー関数であるということです。例えば。一時的なオブジェクトは、フリースタンドバイ関数オーバーロードの正式な参照 - 非 - const引数にバインドすることができないため、ostringstreamオブジェクトを作成して<<を使用すると、この呼び出しはメンバ関数のオーバーロードに解決できます。それがなぜそのようなものなのか、私は誰も知らないと思います。私はそれのいくつかはC++ 0xで修正されたことを思い出しているようですが、わかりません(重要な場合はそれを確認してください)。

乾杯& HTH、

+0

+1は '>>'と優先順位の両方に言及しています。 –

0

ストリーム:。

std::cout << std::string("Plop"); 

これは、メソッドを呼び出すための構文糖です:

std::ostream& operator<<(std::ostream& str, std::string const& data) 
{ 
    // Do Stuff 
    return str; 
} 

実行(Do)のものは、その事がで定義されていませんどのように標準的なものです。

しかし、おそらくそれだけで行います。

2は、出力ストリームのファイル記述子である
write(2, data.c_str(), data.length()); 

。出力ストリームはOSによってアプリケーションに接続されるため、アプリケーションがこのストリームに書き込むときにOSはデータを読み取ることができます。 OSがデータで行うことは、状況に完全に依存しています。

しかし、アプリケーションをコマンドラインから起動した場合、アプリケーションから端末に出力ストリームが接続されている可能性があります。そのため、データの処理(端末の無視、印刷など)端末アプリケーションに完全に依存します。

+0

Nit pick warning :-) "Plop"は 'std :: string'の一時的な強制構築ではなく' const char * 'オーバーライドと一致します。 std :: stringで実行すると、書き込みの例は 'str.write(data.c_str()、data.length());'になりますが、std :: ostream :: write()は:: writeを途中で呼び出すことができますあなたは説明します。 –

+0

私はC :: write(fd、buffer、size)を呼び出していました。ニットピックは別の方法で受け入れた。 –

関連する問題