std :: cin作为while循环条件的奇怪行为

时间:2018-07-30 09:14:19

标签: c++

所以...这是我的代码,引用了 C ++ Primer 1.4.4部分。

#include <iostream>
int main()
{
  int currVal = 0, val = 0;
  if (std::cin >> currVal) {
    int cnt = 1;

    while (std::cin >> val) {
      if (val == currVal) {
        ++cnt;
      } else {
        std::cout << currVal << " occurs "
                  << cnt << " times." << std::endl;
        currVal = val;
        cnt = 1;
      }
    }
    std::cout << currVal << " occurs "
              << cnt << " times." << std::endl;
  }
  return 0;
}

我必须承认,简单程序基本上可以正常工作。但是,对于进一步的讨论,我想首先参考a asciinema recording

在记录中,我运行了./a.out 3次。第一次,我键入数字,然后按 enter 键打印前两个记录,并且仅在按 ctrl + D 键后(最后一个)结果已打印。从本书的前几节中,我知道 ctrl + D 用于馈送一些符号以停止while循环。但是我真的想知道它( ctrl + D 在这里引起奇怪的停止)的工作方式是否与作者的期望一样,因为没有提到如何精确按下键关于书中那个例子。

在最后两次运行中,我的第一种方法是按 ctrl + D (打印第一个结果)和 enter (第二个结果)打印),然后再输入几个 (除了更多行,没有其他响应)。最后,我按了 ctrl + D (打印了第三个结果)。

我的最后一种方法是按 ctrl + D 两次。第一次印刷时打印出第一个结果,第二次印刷时显示出最后两个结果。

在这两次运行中,我感到困惑的是,在按 ctrl + D (我认为)之后,cin流的末尾应该有一个停止信号。那么,为什么while循环没有停止?如果有人能解释其背后的流程,我将不胜感激。

我的工作环境是urxvt上的Manjaro Linux,安装了zshoh-my-zsh

0 个答案:

没有答案