我写了一个简单的代码:
#include <iostream>
using namespace std;
int main()
{
int a, b;
while (cin >> a >> b) //Note the cin inside while loop
{
cout << a << b << "\n";
}
}
我们知道while
循环仅在表达式评估true
(1
)或false
(0
)时起作用。
cin
如何评估true
和false
。
同样当我输入数字时,while循环如何运行,当我输入非数字时停止?它如何评估真假?
答案 0 :(得分:2)
当你写cin >> a
时,你实际上在使用std::istream::operator>>
,根据引用here,此运算符返回istream&
对象引用,并将右手变量(引用)作为其参数。这就是你如何链接它:cin >> a >> b
。
要以另一种方式查看此cin >> a >> b
链,当发生故障时,这是以下两个步骤:
cin >> a
返回一些中间值,假设它是x
。 (您实际上可以尝试auto x = cin >> a
。(cin >> a) >> b
,当我们使用此中间值x
时,我们可以将其写为x >> b
。那么这x
到底是什么? x
此处与cin
保持相同的位置,它是istream&
类型的对象。
因此,当您谈论true
或false
时,您实际上是在讨论是否返回istream&
引用,引用对象,是true
还是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";
}
}
。
因此,您的代码可以扩展为
x
如果您使用的是像Visual Studio这样的IDE,您可以将鼠标指向变量x
,它会提示您istream&
的类型,那将是istream&
另外,感谢Bob__,这个ios::operator bool
类可以转换为true
类,编写为here,无论是false
还是ios_base::iostate
}表示此stream
的状态(while(stream >> value) {...}
),因此,
可以使用返回对流的引用作为循环条件的流和函数,从而产生惯用的C ++输入循环,例如
while(getline(stream, string)){...}
或<li><a href="examples/test.html"></a></li>
。只有在输入操作成功时,这样的循环才会执行循环体。
为了进一步理解,您应该阅读教科书中的操作员(重载)一章。