22

以下两个循环和每个循环何时停止有什么区别?

#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;
}
4

4 回答 4

42

让我们独立地看这些:

while (cin >> x) {
    // code
}

这个循环,直观的意思是“不断地从cinintox中读取值,只要能读取到值,就继续循环”。一旦读取到不是 的值int,或者一旦cin被关闭,循环就会终止。这意味着循环只会在x有效时执行。

另一方面,考虑这个循环:

while (cin){
    cin >> y;
    // code
}

该语句的while (cin)意思是“当所有先前的操作cin都成功时,继续循环”。进入循环后,我们将尝试将值读入y. 这可能会成功,也可能会失败。但是,无论哪种情况,循环都会继续执行。这意味着一旦输入了无效数据或没有更多数据要读取,循环将使用 的旧值再执行一次y,因此您将需要多一次循环迭代。

您绝对应该更喜欢此循环的第一个版本而不是第二个版本。除非有有效数据,否则它永远不会执行迭代。

希望这可以帮助!

于 2013-10-20T21:41:12.410 回答
4
while(cin >> x){
    // code
}

这会读取整数,直到遇到非整数、EOF 或其他流错误。每当您x在循环内使用时,您就知道它已被成功读取。

while(cin){
    cin >> y;
    //code
}

这会读取整数,直到遇到非整数、EOF 或其他流错误。但是,仅在读取整数之前检查流。当你y在循环中使用时,你不能保证它被成功读取。

于 2013-10-20T21:41:44.100 回答
4

不同之处在于,如果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
}
于 2013-10-20T21:39:15.707 回答
2

cin >> x将输入值存储到 x 中。

至于while(cin),std::cin将返回一个关于是否设置了错误标志的布尔值。因此,只要std::cin内部没有设置错误标志,您将继续执行 while 循环。end of file如果它找到一个字符,或者如果它未能读取并存储到值中,则可以设置一个错误标志。

于 2013-10-20T21:41:08.310 回答