cin/coutストリームオブジェクトはなぜ条件式として使用できるのですか?

2066 ワード

C++標準I/Oライブラリの問題は常に多くの人の心に疑問を残していると信じていますが、最近はわざわざI/Oライブラリに関する知識を再理解する必要があるためです.今皆さんと分かち合って、C++の中の初心者はよく知っていますが、迷っている問題です.以下は個人的な見解権を記憶として書いています.
多くの人がこのような例に遭遇したことがあると思います.
string str;
while( cin >> str )
        cout << str << flush;

ほとんどの初心者は「cin>>str」がどのようにwhileの判断文になるのか分からないようです.
実際、「cin>>str」はwhileの条件式としての解答過程である.
第一に、「>>」オペレータを解き、cinに関連付けられたバッファから値を読み出し(空白、ファイル終了子EOF、エラーが発生するまで停止)、読み出したら文字列strに入れ、読み出しに失敗した場合、ファイル終了子EOF、エラーが発生した場合に入力を停止し、対応するストリームステータスタグを設定します.
第二に、「>>」オペレータ関数の結果にかかわらずcinが返されます.
第三に、最も迷っているのは戻ってきたcinオブジェクトがどのようにwhile条件式を作ったのかということです.理論的にはwhileにはbool値に変換する式があるはずです.ネット上では標準ライブラリの再ロードを呼び出すという説があります'!'オペレータ関数を使用して、ストリームのステータスタグを確認します.「while(!cin>>str)」はそうですが、「while(cin>>str)」式では明らかにそうではありません.iosのboolタイプ変換関数を呼び出しcinオブジェクトをbool値に変換する説もある.実はこの解釈は個人的にも間違っていると思います.cppreferenceの次の標準ライブラリ関数ヘルプドキュメントです.
赤い線はcinをbool式に変換するタイプの変換関数の原型を表していますが、「since c++11」から見ると、この関数はc++11からしかありません.その前にC++標準ライブラリにはこの関数はありません. 
実は、この関数を見た人がいるかどうか分かりません.
「while(cin>>str)」は、このタイプの変換関数によって実現され、「while(cin>>str)」という表現を使用すると、コンパイラは自動的に「クラスタイプから変換」を実行し、cinをvoid*タイプのポインタに変換します.cplusplusでは、この標準ライブラリ変換関数について説明します.
 
説明:「この関数はios(istream親)クラスから継承されたタイプの変換関数で、1つのストリームオブジェクトを1つのポインタに変換できます.ストリームオブジェクトのステータスタグが設定されている場合、ストリームオブジェクト変換のポインタは空のポインタになります.そうしないと0以外のポインタになります」.このタイプの変換関数もios親クラスから継承された唯一の非explicitクラスタイプからの変換関数です.
——>   http://www.cplusplus.com/reference/ios/ios/operator_voidpt/
cinをポインタタイプに変換すればwhileの条件式として当然、C++の標準変換で空のポインタをboolタイプのfalseに変換し、非
空のポインタはboolタイプのtrueに変換され、ストリームの状態を判断することに成功します. 
「cin>>str」リードフロー操作が成功すると、フローのステータスタグ(failbit orbadbit)は設定されません.
cinが「void*」タイプ変換関数を実行して変換したポインタは空ではなく、空のポインタ変換ではないboolはtrueである.
「cin>>str」リードフロー操作は失敗し、フローのステータスタグ(failbit orbadbit)が設定され、
cinが「void*」タイプ変換関数を実行して変換したポインタは空で、空のポインタ変換のboolはfalseです.
以上の3つの点から、「cin>>str」は合法的な条件式としてwhileに置くことができる.
记:以上はただ个人の観点と认识で、権は学习のノートとしてみんなと分かち合って、もし间违いがあれば、达人达が指摘することを望みます!