以下两个循环和每个循环何时停止有什么区别?
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int x,y;
while(cin >> x){
// code
}
while(cin){
cin >> y;
//code
}
return 0;
}
答案 0 :(得分:23)
让我们独立看看这些:
while(cin >> x) {
// code
}
这个循环直观地表示“继续将值从cin
读入x
,只要可以读取值,就继续循环。”只要读取的值不是int
,或者只要cin
关闭,循环就会终止。这意味着循环仅在x
有效时执行。
另一方面,请考虑这个循环:
while(cin){
cin >> y;
//code
}
声明while (cin)
表示“当cin
上的所有先前操作都成功时,继续循环。”一旦我们进入循环,我们将尝试将值读入y
。这可能会成功,也可能会失败。但是,无论是哪种情况,循环都将继续执行。这意味着一旦输入了无效数据或者没有更多数据需要读取,循环将使用旧值y
再次执行,因此您将需要多一次循环迭代。
你肯定更喜欢这个循环的第一个版本到第二个版本。除非有有效数据,否则它永远不会执行迭代。
希望这有帮助!
答案 1 :(得分:3)
不同之处在于,如果cin >> whatever
的计算结果为false,则第二个版本仍会运行其余的循环。
我们假设cin >> whatever
失败。会发生什么?
while(cin >> x){
// code that DOESN'T RUN
}
while(cin){
cin >> y;
//code that DOES RUN, even if the previous read failed
}
答案 2 :(得分:2)
while(cin >> x){
// code
}
这会读取整数,直到遇到非整数,EOF或其他流错误。无论何时在循环中使用x
,您都知道它已成功读取。
while(cin){
cin >> y;
//code
}
这会读取整数,直到遇到非整数,EOF或其他流错误。但是,仅在读取整数之前检查流。在循环中使用y
时,无法保证它已成功读取。
答案 3 :(得分:0)
cin >> x
会将输入值存储到x。
至于while(cin)
,std::cin
将返回一个关于是否设置了错误标志的布尔值。因此,只要std::cin
内部没有设置错误标志,您将继续执行while循环。如果找到end of file
字符,或者它无法读取并存储到值中,则可以设置错误标志。