以下两个循环有什么不同,它们何时停止?
#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;
}
让我们分别看看这些:
while (cin >> x) {
// code
}
这个循环直观地意味着“从cin
中继续读取x
的值,并且只要可以读取一个值,就继续循环”。一旦读取到一个不是int
类型的值,或者cin
被关闭,循环就会终止。这意味着循环只在x
有效时执行。
另一方面,考虑以下循环:
while (cin){
cin >> y;
// code
}
while (cin)
语句的意思是“只要前面对cin
的所有操作都成功了,就继续循环”。一旦进入循环,我们会尝试将一个值读入y
中。这可能成功,也可能失败。无论哪种情况,循环都将继续执行。这意味着一旦输入无效数据或没有更多数据可读取,循环将使用y
的旧值再执行一次,因此您将比需要多执行一次循环。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
}
while(cin >> x){
// code
}
这个函数会一直读取整数,直到遇到非整数、EOF或其他流错误。在循环中使用x
时,你就知道它已经成功读取。
while(cin){
cin >> y;
//code
}
这个程序会读取整数,直到遇到非整数、EOF或其他流错误为止。但是,在读取整数之前,流只会被检查一次。当你在循环中使用y
时,无法保证它已经成功读取。
cin >> x
会将输入的值存储到x中。
至于 while(cin)
,std::cin
会返回一个布尔值来表示是否设置了错误标志。因此,只要 std::cin
内部没有设置错误标志,您就可以在 while 循环中继续执行。如果它发现一个 end of file
字符,或者无法读取并存储值,则可能会设置错误标志。
good
、bad
、fail
或eof
。默认情况下,cin
的状态为good
,因此while
块将运行。出于一些原因,我会避免在没有在程序中使用cin
之前就以先前使用cin
的成功或失败来解释while(cin)
。也许这只是个人口味问题。 - eric