cin 在一个 while 循环中

abh*_*tps 0 c++ cin while-loop

我写了一个简单的代码:

#include <iostream>
using namespace std;
int main()
{
  int a, b;
  while (cin >> a >> b)     //Note the cin inside while loop
  { 
    cout << a << b << "\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

我们知道while循环仅在表达式计算true( 1) 或false( 0)时起作用。怎么cin评价truefalse

还有如何当我输入号码后停止,当我输入一些非数字的同时循环中运行?它是如何评价真假的?

Cha*_*eon 5

当你写的时候cin >> a,你实际上是在使用std::istream::operator>>,根据这里的引用,这个操作符返回一个istream&对象引用,并把右手边的变量(引用)作为它的参数。这是你如何IT连锁,如:cin >> a >> b

cin >> a >> b换个角度看这条链,当分解时,就是这两个步骤:

  • 第一步,cin >> a返回一些中间值,假设它是x。(您实际上可以尝试auto x = cin >> a.
  • 第二步,你正在做的(cin >> a) >> b,当我们使用这个中间值时x,我们可以把它写成x >> b

那么这是什么鬼xxhere 与 保持相同的位置cin,它是一个istream&类型的对象。

因此,当您谈论trueor 时false,您实际上是在谈论 this 返回的istream&引用是否引用了一个对象,无论是trueor false。这将是false在标准输出捕获一个EOF标志(当你在类Unix系统中按Ctrl-C,或者当您已经阅读到文件的末尾等)。

因此,您的代码可以扩展为

#include <iostream>
using namespace std;
int main()
{
  int a, b;
  auto x = cin >> a >> b
  while (x)
  { 
    cout << a << b << "\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是像 Visual Studio 这样的 IDE,您可以将鼠标指向变量x,它会提示您x输入istream&.

另外,多亏了 Bob__,这个istream&类可以转换成一个ios::operator bool类,就像这里写的那样,无论它是truefalse代表ios_base::iostatethis的 state( ) stream,因此,

使使用流和函数返回对流的引用作为循环条件成为可能,从而产生惯用的 C++ 输入循环,例如while(stream >> value) {...}while(getline(stream, string)){...}。此类循环仅在输入操作成功时才​​执行循环体。

为了进一步理解,您应该阅读教科书中的运算符(重载)章节。