【问题标题】:What's the difference between while(cin) and while(cin >> num)while(cin) 和 while(cin >> num) 有什么区别
【发布时间】:2013-10-29 06:32:30
【问题描述】:

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

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

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    让我们分别看一下:

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

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

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

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

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

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

    希望这会有所帮助!

    【讨论】:

    • "只要能读取到值,就继续循环",即如果读取成功,则执行循环体。
    • The statement while (cin) means "while all previous operations on cin have succeeded, continue to loop." 第一次通过循环呢?如果您还没有使用cin,为什么它甚至会启动?
    • @neuronet 在这种情况下,(vacuously!) 为真,所有先前的操作都已成功,因此条件将评估为真,循环将执行。
    • 我会更直白一点:一个流可以有四种可能的状态:goodbadfaileof。默认情况下,cingood 状态启动,因此while 块将运行。出于几个原因,当程序中没有以前使用过cin 时,我会避免用以前使用cin 的成功或失败来解释while(cin)。也许这是一个品味问题。
    【解决方案2】:

    不同之处在于,如果 cin &gt;&gt; whatever 的计算结果为 false,您的第二个版本仍会运行循环的其余部分。

    假设cin &gt;&gt; whatever 失败。会发生什么?

    while(cin >> x){
        // code that DOESN'T RUN
    }
    
    while(cin){
        cin >> y;
        //code that DOES RUN, even if the previous read failed
    }
    

    【讨论】:

    • 我不这么认为,因为我在网上评委中使用它,结果是错误的答案而不是时间限制!
    【解决方案3】:
    while(cin >> x){
        // code
    }
    

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

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

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

    【讨论】:

      【解决方案4】:

      cin &gt;&gt; x 会将输入值存储到 x 中。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 2018-12-02
        • 1970-01-01
        • 2019-02-12
        • 2011-01-16
        • 2017-11-28
        • 1970-01-01
        相关资源
        最近更新 更多