C ++布尔评估

时间:2012-05-30 23:42:35

标签: c++ boolean type-conversion iostream

所以我很好奇为什么会这样。

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.

为什么程序会进入无限循环?

2 个答案:

答案 0 :(得分:24)

实际上,用于阅读operator>>的{​​{1}}重载仅允许值bool0作为有效输入。运算符重载遵循1类模板,该模板从输入流中读取下一个数字,然后表现如下(C ++11§22.4.2.1/ 6):

  
      
  • 如果要存储的值为num_get,则会存储0

  •   
  • 如果值为false,则会存储1

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

  •   

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

当您输入的值不是0或1时,将在流上设置失败状态,这会导致进一步的提取失败。 false设置为answer并永久保留true,从而导致无限循环。

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

true

答案 1 :(得分:15)

因为如果输入不是0或1,operator>>会失败,并且当它失败时,它不会消耗输入。所以循环包括读取数字然后重复读取它。

尝试更改这样的代码以查看它:

if (cin >> answer) {
  cout << answer << endl;
} else {
  cerr << "oops" << endl;
  break;
}