所以我很好奇为什么会这样。
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.
为什么程序会进入无限循环?
答案 0 :(得分:24)
实际上,用于阅读operator>>
的{{1}}重载仅允许值bool
或0
作为有效输入。运算符重载遵循1
类模板,该模板从输入流中读取下一个数字,然后表现如下(C ++11§22.4.2.1/ 6):
如果要存储的值为
num_get
,则会存储0
。如果值为
false
,则会存储1
。否则会存储
true
并将true
分配给ios_base::failbit
。
(err
这里是您正在阅读的流的错误状态;在这种情况下是err
。请注意,还有其他语言指定cin
操纵器时的行为used,允许使用其名称boolalpha
和true
插入和提取布尔值;为简洁起见,我省略了其他细节。)
当您输入的值不是0或1时,将在流上设置失败状态,这会导致进一步的提取失败。 false
设置为answer
并永久保留true
,从而导致无限循环。
每次提取后都必须测试流的状态,以查看提取是否成功以及流是否仍处于良好状态。例如,您可以将循环重写为:
true
答案 1 :(得分:15)
因为如果输入不是0或1,operator>>
会失败,并且当它失败时,它不会消耗输入。所以循环包括读取数字然后重复读取它。
尝试更改这样的代码以查看它:
if (cin >> answer) {
cout << answer << endl;
} else {
cerr << "oops" << endl;
break;
}