while (in)
检查是否没有发生错误.这和写作一样while (!in.fail())
在你打电话in >> word
并获得第一个"寒意"后,while (in)
仍然是真的,直到下一次打电话给in >> word
.当你in >> word
再次点击它失败,因为它在文件的末尾并且没有写任何内容word
,但是word
变量在上一次仍然有"Chill",所以你再次计算它.然后while (in)
在下一次迭代时最终失败.
调用while (in >> word) { ++count; }
工作因为in >> word
实际上是in.operator>>(word)
碰巧返回的函数istream&
,并且istream
有一个operator bool
方法允许你在一个条件而不是写条件中使用它!in.fail()
.我知道,有点环形交叉路口.点是,它调用in >> word
,然后检查if (in)
,如果它通过,然后调用++count;
并再次迭代.与您的原始技术相比,word
即使in >> word
失败也会计算之前的技术.
为了使这一点更清楚,可能有助于知道将原始代码的if
语句更改为if (in)
也可以工作,但是会有一些不好的代码.
作为最后的结论,整个函数可以写成:
int countWords(std::istream& in) { int count = 0; for (std::string word; in >> word; ++count) {} return count; }