【问题标题】:How is if (cin) { while(cin)... Works?if (cin) { while(cin)... 是如何工作的?
【发布时间】:2019-02-12 16:00:29
【问题描述】:
int main () {
int num1, num2;
int cnt = 1;
    if (cin >> num1){       
        while (cin >> num2){
              if (num1==num2){
                  ++cnt;
              } else {
                  cout << num1 << " is " << cnt << " times" << endl;
                  cnt = 1;
                  num1 = num2;
              }
        }
    }
    cout << num1 << " is " << cnt << "-times" << endl;
}

此代码接受一行数字并输出每个数字输入的次数。我不明白为什么会有num1=num2。删除它后,程序会输出输入的第一个数字,这让我相信我不知道cin 在循环中是如何工作的。

我现在认为第一个数字进入 if (cin &gt;&gt; num1), 并且它一直坐在这里,下一个相同的数字不会覆盖 num1 整数。进入while (cin &gt;&gt; num2) 的第二个和其余数字每次都会覆盖它,直到有一个不同的数字,这使得else 执行并输出一直存储在num1 中的数字。

使用 num1=num2 它会在 if(cin&gt;&gt; num1) 中更改 num1,然后整个事情又开始了。 我说的对吗?

这也很奇怪,最后一个 cout 可能确定在第一个 if 体内,它可能不会,它无论如何都可以工作......

Edit1: with num1=num2;我输入1 1 2 2 3 3 3,一行输出

1 is 2 times

2 is 2 times

3 is 3 times. 

没有 num1=num1;

1 is 2 times

1 is 1 times

1 is 1 times

1 is 1 times

1 is 1 times

【问题讨论】:

    标签: c++


    【解决方案1】:
    #include <iostream>
    
    int main () {
        int num1, num2;
        int cnt = 1;
        if (std::cin >> num1) { // if a valid integer can be extracted from cin
            while (std::cin >> num2) { // do as long as valid integers are extracted from cin
                if (num1 == num2) { // if the first extracted int matches the next one
                    ++cnt; // increase the count
                }
                else { // if it is a different int then do some output and
                    std::cout << num1 << " is " << cnt << " times\n";
                    cnt = 1; // reset the counter and
                    num1 = num2; // remember the new extracted number for
                                 // the next iteration of the while-loop
                                 // since only num2 will be read again from cin
                }
            }
        }
        std::cout << num1 << " is " << cnt << "-times\n";
    }
    

    由于main() 中的最后一行如果没有有效输入就毫无意义,我主张提前退出:

    #include <cstdlib>
    #include <iostream>
    
    int main () {
        // ...
        if (!( std::cin >> num1 ))
            return EXIT_FAILURE;
    
        while (std::cin >> num2) {
            if (num1 == num2) {
        //  ...
    

    它还减少了缩进级别,从而提高了可读性。

    【讨论】:

      【解决方案2】:

      第一个 if if (cin &gt;&gt; num1) 检查 num1 是否有输入(当然是等待输入),然后才会继续循环。

      然后等待num2的第二次输入,如果输入为空则进入循环。

      然后它比较两个输入。如果它们相同......它会增加计数器。 否则,它将输出在一行中检测到相同输入的次数然后将比较输入更改为最后输入的值并重复循环,等待输入。

      所以它会比较你提供相同输入的次数...

      基本上如果输入是:

      5
      5
      5
      1
      

      输出将是“5 是 3 倍”

      如果输入是

      1
      5
      5
      5
      

      输出将是“1 是 1 次”

      【讨论】:

        【解决方案3】:

        cin &gt;&gt; num1 尝试将标准输入中的数字读入num1 变量。如果成功,if 的主体将被执行。否则(例如,如果用户输入的不是数字或立即按下 Ctrl-d/Ctrl-z),我们直接跳转到 if 之后的代码。这种情况只发生一次。

        cin &gt;&gt; num2num2 变量执行相同的操作,只不过这次它位于 while 内部,而不是 if。因此,如果输入操作成功,则执行 while 循环的主体,然后再次执行 cin &gt;&gt; num2,直到最终失败。

        我不明白为什么会有num1=num2

        正如我所说,cin &gt;&gt; num1 只执行一次(它不在任何循环内)。因此,如果您从不重新分配num1,它将始终保留输入的第一个值。但是您不希望这样,您希望它包含您当前正在计算的值。这就是为什么有这个任务。

        使用 num1=num2 它改变了 if(cin>> num1) 中的 num1 并且整个事情重新开始。我说的对吗?

        不,cin &gt;&gt; num1 不再执行。它不在循环内。只有cin &gt;&gt; num2 被多次执行,因为那是while 循环的一部分。

        这也很奇怪,最后一个 cout 可能会在 first if 体内确定,它可能不会,它仍然可以工作......

        如果第一次输入操作失败,会立即跳转到body外面。如果cout 语句在那里,这意味着即使第一个输入失败,它也会被执行。在这种情况下,num1 将未初始化,因此使用它将调用未定义的行为。因此,该语句不应位于if 之外。

        【讨论】:

        • bist Du das, SeppJ? O.O
        • @Swordfish Nö,我从未使用过 SeppJ 的昵称,我的姓氏也不以 J 开头。
        • 好的,我明白了。 42. 15 个字符。
        【解决方案4】:

        我理解代码所做的是计算并显示一个数字连续出现的次数,因此它不适用于无序列表。

        也就是说,它的工作原理基本上如下:

        1. 查看流中是否有可用的数字,如果有,将其存储在num1
        2. 对于以下每个号码,将号码读到num2
        3. 如果num1num2 相同,则递增计数器。
        4. 但是,如果数字不相同:输出重复计数,将计数器设置为 1,将比较的第一个数字 (num1) 更改为新读取的数字 ( num2)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-29
          • 2010-11-08
          • 2020-09-12
          • 2014-03-06
          • 2011-11-26
          • 2017-07-09
          • 2011-08-05
          • 1970-01-01
          相关资源
          最近更新 更多