if(cin){while(cin)...如何运作?

时间:2018-09-07 10:03:08

标签: c++

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 >> num1),,它一直坐在这里,下一个相同的数字不会覆盖num1整数。每次进入while (cin >> num2)的第二位和其余数字都会覆盖它,直到有一个不同的数字为止,这使else执行并输出一直存储在num1中的数字。

使用 num1=num2 更改num1中的 if(cin>> num1) ,然后重新开始。 我说的对吗?

奇怪的是,最后一个提示可能会确定在第一个 if 主体内部,但不一定,它仍然可以工作...

Edit1: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

4 个答案:

答案 0 :(得分:4)

#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) {
    //  ...

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

答案 1 :(得分:1)

cin >> num1尝试从标准输入中读取一个数字到num1变量中。如果成功,则将执行if的主体。否则(例如,如果用户输入的不是数字,或者立即按了Ctrl-d / Ctrl-z),我们将直接跳到if之后的代码。这恰好发生一次。

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

  

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

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

  

当num1 = num2时,它将在if(cin >> num1)中更改num1,然后重新开始整个操作。我说的对吗?

否,cin >> num1再也不会执行。它不在循环内。多次执行只有cin >> num2,因为该循环属于while的一部分。

  

还有一个奇怪的地方是,最后一个球杆肯定会在第一个球体内部(如果不是),那么它肯定不会起作用……

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

然后,它等待第二个输入到num2中,如果输入为空,则进入循环。

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

因此它比较了您一次又一次提供相同输入的次数...

基本上,如果输入是:

5
5
5
1

输出将为“ 5是3倍”

如果输入是

1
5
5
5

输出将为“ 1是1倍”