以下两个循环和每个循环何时停止有什么区别?
#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
intox
中读取值,只要能读取到值,就继续循环”。一旦读取到不是 的值int
,或者一旦cin
被关闭,循环就会终止。这意味着循环只会在x
有效时执行。
另一方面,考虑这个循环:
while (cin){
cin >> y;
// code
}
该语句的while (cin)
意思是“当所有先前的操作cin
都成功时,继续循环”。进入循环后,我们将尝试将值读入y
. 这可能会成功,也可能会失败。但是,无论哪种情况,循环都会继续执行。这意味着一旦输入了无效数据或没有更多数据要读取,循环将使用 的旧值再执行一次y
,因此您将需要多一次循环迭代。
您绝对应该更喜欢此循环的第一个版本而不是第二个版本。除非有有效数据,否则它永远不会执行迭代。
希望这可以帮助!
while(cin >> x){
// code
}
这会读取整数,直到遇到非整数、EOF 或其他流错误。每当您x
在循环内使用时,您就知道它已被成功读取。
while(cin){
cin >> y;
//code
}
这会读取整数,直到遇到非整数、EOF 或其他流错误。但是,仅在读取整数之前检查流。当你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
}
cin >> x
将输入值存储到 x 中。
至于while(cin)
,std::cin
将返回一个关于是否设置了错误标志的布尔值。因此,只要std::cin
内部没有设置错误标志,您将继续执行 while 循环。end of file
如果它找到一个字符,或者如果它未能读取并存储到值中,则可以设置一个错误标志。