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>>用于读取 a 的重载bool只允许0or1作为有效输入。运算符重载num_get遵循类模板,该模板从输入流中读取下一个数字,然后行为如下(C++11 §22.4.2.1/6):

  • 如果要存储的值是0,则false存储。

  • 如果值是1true存储。

  • 否则true存储并ios_base::failbit分配给err

err这里是您正在读取的流的错误状态;cin在这种情况下。请注意,还有其他语言指定了boolalpha使用操纵器时的行为,它允许使用它们的名称插入和提取布尔值,true并且false;我有为简洁起见,省略了这些其他细节。)

当您输入零或一以外的值时,会在流上设置失败状态,这会导致进一步的提取失败。 answer设置为truetrue永远保持,导致无限循环。

您必须在每次提取后测试流的状态,以查看提取是否成功以及流是否仍处于良好状态。例如,您可以将循环重写为:

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 回答