C++:我不明白循环是如何工作的

C++: I don't understand how this while loop works

本文关键字:何工作 工作 明白 循环 C++      更新时间:2023-10-16

我正在查看这里的一些问题,这些问题向您展示了如何从文本文件中读取,然后将其中的任何内容分配给单独的变量。答案是使用一个像这样的while循环…

ifstream file(“file.txt”);
int var1;
int var2;
int var3;
while (file >> var1 >> var2 >> var3)
{
    /* do something with name, var1 etc. */
    cout << var1 << var2 << var3 << “n”;
}

我的问题是,在while循环中发生了什么,允许它为这些变量分配正确的值?我知道它是有效的,因为我用过它,但我就是不明白它是如何工作的。

这是我正在看的链接,以防有人也想看它。c++:从文本文件中读取并分离到变量

谢谢!

基本上,"expression"(a) file >> var1 >> var2 >> var3将尝试从file流中读取三个值并将它们放入指定的变量中。它基本上与cin >> myVar本身没有什么不同(除了它将输入链接到多个变量)。

整个表达式的当且仅当三个值都被成功读取时为真。

在这种情况下,循环体将执行,三个值将被打印出来,循环将返回顶部并尝试获取下三个值。

当表达式的计算结果为false时(即没有读取三个值),循环将停止。


(a)someStream >> someVariable到布尔值的实际路径涉及流类中的几个步骤(从operator>>的返回值与operator bool转换为布尔值),但上述解释对于大多数用途应该足够好。

ifstream重载操作符>>。在您的特殊情况下,它是:

basic_istream& operator>>( int& value );
如你所见,

返回对自身的引用,所以你可以重写:

 while (file >> var1 >> var2 >> var3)

作为函数调用:

while (file.operator>>(var1).operator>>(var2).operator>>(var3))

另外ifstream显式转换为bool,如果流是ok则为true,否则为false。此转换使用bool操作符完成,该操作符被标记为显式(c++ 11及以上版本)。应用于转换操作符的说明符允许在while循环或if语句中使用ifstream实例,但它不允许您将其分配给bool变量:

bool b = file; // results in error

编译器会将:file >> var1 >> var2 >> var3翻译成:file.operator>>(var1).operator>>(var2).operator(var3)

basic_istream::operator>>(int&)的返回值是basic_istream&,因此提取操作符可以在它的返回值上重复调用,因为它返回对自身的引用。

当你像在:while(file >> var1 >> var2 >> var3)中那样求值时,编译器实际上在做:while(file.operator>>(var1).operator>>(var2).operator(var3).operator bool()),我们可以看到basic_stream提供了operator bool(),所以这将作为while循环的条件被求值。And operator bool():

返回true,如果流没有错误并且准备好进行I/O操作。具体来说,返回!fail()

因此,这一行的人类可读解释是:"将var1, var2var3插入file。如果插入没有失败,继续循环。"