0

アマチュアプログラマーとして、これは私を混乱させます。私はおそらく何かが欠けているだけです。私が見たC++コードでは、次のようなものがあります。

while (cin.get(c)) {...}

ほとんどtry文であるかのように。ステートメントが成功した場合は、関数が true を返したようになり、そうでない場合は false を返したようになります。私はこのようなことをよく見てきました。時には他の言語で。それはどのように機能しますか?私は何かが足りないのですか (機能しない場合に false を返す関数など)? そうでない場合、これはすべての言語で機能しますか?

4

4 に答える 4

3

get(char_type &)C ++参照は、メソッドの戻り値が*thisタイプbasic_istream &1 )であることに注意します。basic_istream継承元にはbasic_ios、I / O障害が発生した場合は基本的にfalseを返し、それ以外の場合はtrueを返す変換演算子があります(2)。

于 2012-08-14T01:00:48.157 に答える
0

ここを見てください:http ://www.cplusplus.com/reference/iostream/istream/get/ 使用しているバージョンは2番目(istream& get ( char& c );)です。C ++では、pstが述べたように、0またはNULL以外の値はすべてtrueになり、それ以外の場合はfalseになります。あなたの場合、cin.getを呼び出すたびに* thisが返されますが、これはtrueになるため、EOF "char"の読み取りなどの「問題」が発生するまで無限ループが発生します(^ C => Ctrl + C) Windowsの場合)。

于 2012-08-14T01:02:34.723 に答える
0

ステートメントは、真のif式を評価します...真の式は、値を持つブール値true、または暗黙的に変換できる何らかの値に直接評価できますtrue(たとえば、数値/ポインター値は、0 以外の場合は真です)。

関数はまたは を返すtruefalse、ブール型または数値型への変換演算子を持つオブジェクトを返すことができます。

この場合、オブジェクトcin.get(c)への参照を返しますcin。これは、ブール値に暗黙的に変換できます ( http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/void*を参照)。入力の成功または失敗をチェックします。オペレーション。

これは、すべての関数またはすべての言語で機能するわけではありません。この方法でテストする意味のあるブール値または数値を返す関数でのみ機能します。例えば:

if (std::cin >> a >> b)    // true if both inputted successfully...

if (my_vector.capacity())   // useless? - capacity may be >0 "true" irrespective of size()

if (my_vector.empty())      // makes sense - returns a boolean

if (my_vector.size())       // makes sense - returns a number, non-0 is "true"
                            // dubious style as a change from vector to list would require
                            // a change to !empty() to maintain O(1) performance in C++03
于 2012-08-14T01:41:45.937 に答える