23

だから私はなぜこれが起こるのか興味があります。

int main()
{
   bool answer = true;
   while(answer)
   {
      cout << "\nInput?\n";
      cin >> answer;
   }
return 0;
}

予想される動作:0-プログラムを終了します、1-再度プロンプトを表示します、1-以外のゼロ以外の整数-再度プロンプトを表示します

実際の動作:0-予想どおり、1-予想どおり、1-以外のゼロ以外の整数-無限ループ

http://www.learncpp.com/cpp-tutorial/26-boolean-values/から

One additional note: when converting integers to booleans, 
the integer zero resolves to boolean false, 
whereas non-zero integers all resolve to true.

プログラムが無限ループに入るのはなぜですか?

4

2 に答える 2

24

事実上、operator>>読み取りに使用される過負荷は、または有効な入力としてboolの値のみを許可します。演算子のオーバーロードはクラステンプレートに従います。クラステンプレートは入力ストリームから次の番号を読み取り、次のように動作します(C++11§22.4.2.1/6)。01num_get

  • 保存する値が保存されている0場合false

  • 値が保存されている1場合。true

  • それ以外の場合trueは保存され、ios_base::failbitに割り当てられerrます。

errこれがあなたが読んでいるストリームのエラー状態です;cinこの場合。boolalphaマニピュレータが使用されるときの動作を指定する追加の言語があることに注意してください。これによりブール値を名前を使用して挿入および抽出できますtruefalse;私は簡潔にするために、これらの他の詳細は省略しました。)

0または1以外の値を入力すると、ストリームに失敗状態が設定され、それ以降の抽出が失敗します。 answerに設定され、永久にtrue残りtrue、無限ループが発生します。

抽出が成功したかどうか、およびストリームがまだ良好な状態にあるかどうかを確認するために、抽出のたびにストリームの状態をテストする必要があります。たとえば、ループを次のように書き直すことができます。

bool answer = true;
while (std::cin && answer)
{
    std::cout << "\nInput?\n";
    std::cin >> answer;
}
于 2012-05-31T00:04:58.523 に答える
15

operator>>入力が0または1でない場合は失敗し、失敗した場合は入力を消費しないためです。したがって、ループは、数字を読み取り、次にそれを再度読み取らないことで構成されます。

次のようにコードを変更してみてください。

if (cin >> answer) {
  cout << answer << endl;
} else {
  cerr << "oops" << endl;
  break;
}
于 2012-05-30T23:46:56.037 に答える