Cin 在 for 循环中使用后被跳过

Cin getting skipped after being used in for loop

只写了 3-4 行来重现问题。在 "for loop" 中使用 cin >> 重复输入后,所有下一个 cin >> (s) 总是被跳过。

Anything/Everything 除了 cin 工作正常。(只是想知道为什么会发生这种情况以及我该怎么做才能在程序中进一步使用 cin

for(int x;cin >> x;){
        cout << x <<endl;
}
int a;
cin >>a;

没有错误信息。

无论您使 cin >> x 失败(打破循环)的任何操作都会影响 cin >> a,因为它是同一个该死的命令!

对象 cin 与您的循环逻辑 "know" 无关,您的操作 system/terminal 也与此无关,它通常也不知道您打算进行某种 "reset" 一旦循环被打破就会发生。你必须自己发出信号。但是,您可能不能只修补它,因为:

  • 如果按Ctrl+C结束程序,则程序结束。
  • 如果您按下 Ctrl+D (Linux/macOS) 或 Ctrl+Z (Windows),那么您为流提供了 "end of file" 条件,它将不再接受. std::cin 对象将在其上设置 EOF 标志,并且持续存在。 (有时您可以手动清除它,但我不建议这样做,因为您可能会在发送端陷入混乱,具体取决于您的平台……)

你必须找到另一种方法来打破你的循环,或者使用一些 "magic reserved number",通过更复杂的输入协议,通过只读取一些数字 n初始输入的数量,或其他一些方式,具体取决于您要执行的操作。

for头中的第二个表达式是循环条件;只要这是真的,循环就会继续运行。您的条件始终为真,因此循环永远不会退出。

您可以在循环中添加一些代码以退出它,例如if (x == 0) break;

但是,我建议重新设计循环。您的循环条件非常不寻常,在大多数人弄清楚发生了什么之前会给他们一些 head-scratching 。或许你可以把读取操作放在循环体内?

>> 的工作原理

对于std::basic_istreamstd::cin是其中之一),>>运算符被覆盖以实现格式化数据提取,并且它被设计为可链接(例如cin >> a >> b >> c).这是有效的,因为:

  1. >> 是 left-associative,因此分组为 ((cin >> a) >> b) >> c)
  2. >> returns 对流对象的引用,因此您可以根据需要继续添加更多 >>

此外,std::basic_istream 可以转换为 bool,只要没有发生错误,就会成为 true。因此,您的循环条件始终是 cin,并且由于您可能没有收到错误,因此始终为真。