質問
知っているcoutてバッファの数日前、私はgoogleではこのバッファは一部のようにスタックの出力の出力コンデンサcoutとprintfを右から左へ、それらのコンソールまたはファイル)を上からbottem.このような
a = 1; b = 2; c = 3;
cout<<a<<b<<c<<endl;
buffer:|3|2|1|<- (take “<-” as a poniter)
output:|3|2|<- (output 1)
|3|<- (output 2)
|<- (output 3)
そしてコード以下、
#include <iostream>
using namespace std;
int c = 6;
int f()
{
c+=1;
return c;
}
int main()
{
int i = 0;
cout <<"i="<<i<<" i++="<<i++<<" i--="<<i--<<endl;
i = 0;
printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );
cout<<f()<<" "<<f()<<" "<<f()<<endl;
c = 6;
printf("%d %d %d\n" , f() , f() ,f() );
system("pause");
return 0;
}
下VS2005、出力は
i=0 i++=-1 i--=0
i=0 i++=-1 i--=0
9 8 7
9 8 7
このスタック方法は、右~ しかし、C++のプライマープラスは、昨日というのは、cout作品左から右に、毎時間を返しオブジェクト(cout)"の特徴をまとめて見ることができるコンピュー出力用に挿入".が左から右方せるものであるこcout<
その Alnitak 教えて、" << オペレーターはostream&オペレーター<<(ostream&os,int)でのもう一つの方法で書くことです:オペレーター<< (オペレーター<< (オペレーター<< (cout、a),b),c)",
場合にはrightestの引数が最初に評価できるかを説明します。
私は迷うcoutのバッファの仕事は、誰かの助けすか?
解決
で混合することができました。日付:
- 実施内容
cout
- 通話が連鎖
- 呼び出し規約
読み込みします。とは考えないようにしましょします。
printf("i=%d i++=%d i--=%d ",i,i++、--);
上記のラインを呼び出しません.読みよくあるご質問 3.2.注し、そのまま観察する側-効果関数の呼び出し規約のパラメータに渡されたのスタックが特定の実施(。ことを保証するものではありませんと同じだったが、その中で全国的に展開。
いという思いを大切にしていくの関数呼び出バッファリング.する場合 cout
計算書その後複数の挿入 <<
んを呼び出し複数の機能を呼び出し、ついで行われるようになりました。ですが私たちと一緒に働きま
cout << 42 << 0;
なりつつあることを実感している:すぐ
cout = operator<<(cout, 42)
し、それを返し、別の呼び出しと同じオペレーターとして
cout = operator<<(cout, 0)
そのまま試験による上記のないもの cout
社内表現。ていただきたいのヘッダファイルを知りたい。
他のヒント
ただ、一般的なヒントとして、決して私は私や私の別の使い方として、同じ行に++を使用 - ます。
問題は、その関数の引数は、任意の順序で評価することが可能であるので、あなたの関数の引数は、(例えばインクリメントとデクリメント操作など)の任意の副作用を持っている場合、あなたは彼らがあなたが期待するために動作することを保証することはできません。これは、回避するためのものです。
同じことがあなたのCOUTの使用状況の実際の展開に似ているこの場合、のために行きます
はfunction1(機能2(FOO)、バール);
コンパイラは関数2、またはその逆を呼び出す前にバーをevaulateして自由です。あなたは、その機能2は、その引数が特定の順序で評価されることはfunction1が呼び出される前に、例えば、返却しませんが、保証することができます。
これはあなたのような何かをするときに問題になります:
はfunction1(機能2(iは++)、I);
あなたは「私が」「私は++」、そう、あなたが予想よりも異なる結果を取得する可能性が高いです、または異なるコンパイラやのさえ異なるバージョンの異なる結果の前または後に評価されるかどうかを指定する方法がありません同じコンパイラます。
ボトムライン、副作用との声明を避けます。彼らはライン上の唯一の文だかご存知の場合は、一度だけ同じ変数を変更している場合にのみ、それらを使用しています。 (A "ライン" 単一の文プラスセミコロンを意味します。)
あなたは何を参照してください未定義の動作です。
ローカルi
およびグローバルc
を追加/シーケンスポイントなしで複数回減算されます。これは、あなたが得る値は何でもできることを意味します。コンパイラ、おそらくはプロセッサアーキテクチャとコアの数に依存する。
cout
バッファは、キューとして考えることができます。
正しくあなたは未定義の動作を見ていると指摘する他の回答に加えて、私はstd::cout
が内部バッファリングを行うために型std::streambuf
のオブジェクトを使用することを言及したい考え出しました。基本的にそれがバッファの表す抽象クラスである(サイズは、実装に特有であり、さらにunbufferdストリームバッファを0とすることができます)。それが「オーバーフローする」とき、それは標準出力にフラッシュされていることをstd::cout
のための1つのような書かれています。
実際には、あなたはstd::streambuf
(またはそのことについては、ストリーム)に関連付けられているstd::cout
を変更することができます。あなたが巧妙な何かをしたい場合、これは便利のようにしているすべてのstd::cout
は、ログファイルか何かで終わりを呼び出します。
と dirkgentlyあなたが呼び出し規約を混乱さの言ったようにその他の詳細と、彼らは:: coutののバッファリングをはstdとは全く関係ありません。
また、出力パラダイム(printf関数とCOUT)の混合実装特有である。