如果(!(是>>秒))意味 着?

what does if(! (is >> s)) mean?

本文关键字:gt 意味 如果      更新时间:2023-10-16

这是一个重载的>>运算符函数:

std::istream& operator>>(std::istream& is, std::vector<int>& v){
  string s;
  if (! (is >> s) )
    return is;
   ...
  return is;
}

据我了解,if(! (is >> s))没有意义,因为终端或控制台将等到来自键盘或其他来源的输入进入s 。因此,if()的条件价值最终将false。谁能帮忙?

is >> s尝试从流is读取字符串s

istream operator>>() 返回对 is 的引用。

istream operator!()测试流是否处于无效状态。 具体来说,如果设置了流的坏位或故障位,它会返回true

所以

 if (! (is >> s) )
     return is;

在功能上等效于

 is >> s;
 if (is.fail()) return is;    // is.fail() returns true if failbit or badbit are set

这意味着如果从流中读取字符串失败,该函数会立即返回。 请注意,这与到达流的末尾不同。

istream不必

是控制台。 它可以是字符串流。 此外,应用程序代码看不到"等待用户输入"。 它在输入流被填充时处于睡眠状态(由操作系统、底层库等(

无论如何:如果输入流根本不包含任何数据,则此条件将为真。

std::string s; // empty!
std::stringstream ss(s);
std::vector<std::string> strings;
ss >> strings; // should be empty!

要理解if (!(is >> s))的含义,您需要了解if (is >> s)的含义。

由于is是一个std::istream,运算符>>返回一个std::istream。因此,is >> s是一个std::istream,它在if内必须产生一个逻辑值truefalse。这个问答解释了如何在不同版本的C++中完成它。从本质上讲,当操作成功时,std::istream评估为真实条件。

现在您知道了is >> s的含义,您可以发现添加否定会颠倒该含义:只有当从is读取s不成功时,!(is >> s)才会成立。对于字符串,读取失败意味着流处于无效状态,例如,因为已到达流的末尾。

你在一行中做很多事情

! (is >> s)

您获取输入流并使用它来分配对象 S,即在 if 条件中评估 S 的结果