“while(cin)”和“while(cin >> num)”有什么区别?

25

以下两个循环有什么不同,它们何时停止?

#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个回答

50

让我们分别看看这些:

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

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

另一方面,考虑以下循环:

while (cin){
    cin >> y;
    // code
}
while (cin)语句的意思是“只要前面对cin的所有操作都成功了,就继续循环”。一旦进入循环,我们会尝试将一个值读入y中。这可能成功,也可能失败。无论哪种情况,循环都将继续执行。这意味着一旦输入无效数据或没有更多数据可读取,循环将使用y的旧值再执行一次,因此您将比需要多执行一次循环。
相比第二个版本,您应该明确选择使用第一个版本的循环。它只在有有效数据时才执行迭代。
希望这能帮到您!

只要可以读取一个值,就继续循环执行。 - dyp
语句 while (cin) 的意思是“只要 cin 的所有先前操作都成功,就继续循环。”那么第一次循环怎么办?如果你还没有使用过 cin,为什么它会开始呢? - eric
1
在这种情况下,它将会是(空虚!)所有先前的操作都成功了,因此条件将求值为真并且循环将执行。 - templatetypedef
我只是更加字面地解释:流可以处于四种可能的状态:goodbadfaileof。默认情况下,cin的状态为good,因此while块将运行。出于一些原因,我会避免在没有在程序中使用cin之前就以先前使用cin的成功或失败来解释while(cin)。也许这只是个人口味问题。 - eric

5
区别在于如果 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
}

我不这么认为,因为我在在线评测中使用它时,结果是错误的答案,而不是超时! - Ahmed_Mohsen

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

这个函数会一直读取整数,直到遇到非整数、EOF或其他流错误。在循环中使用x时,你就知道它已经成功读取。

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

这个程序会读取整数,直到遇到非整数、EOF或其他流错误为止。但是,在读取整数之前,流只会被检查一次。当你在循环中使用y时,无法保证它已经成功读取。


2

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

至于 while(cin)std::cin 会返回一个布尔值来表示是否设置了错误标志。因此,只要 std::cin 内部没有设置错误标志,您就可以在 while 循环中继续执行。如果它发现一个 end of file 字符,或者无法读取并存储值,则可能会设置错误标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接