if(! (is >> s)) 是什么意思?

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

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

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。谁能帮忙?

istream 不一定是控制台。它可以是一个字符串流。此外,应用程序代码看不到 'waiting for user input'。它在输入流被填充时处于休眠状态(由操作系统、底层库、...)

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

std::string s; // empty!
std::stringstream ss(s);

std::vector<std::string> strings;
ss >> strings; // should be empty!

你在一行中做了很多事情

! (is >> s)

你获取输入流并使用它来分配对象 s,在 if 条件下评估 s 的结果

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

由于 is 是一个 std::istream,运算符 >> returns 是一个 std::istream。因此,is >> s 是一个 std::istream,它在 if 中必须产生一个逻辑值 truefalseThis Q&A 解释了它在不同版本的 C++ 中是如何完成的。本质上,当操作成功时,std::istream 评估为真条件。

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

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

istreams operator>>() returns 对 is.

的引用

istreams operator!() 测试流是否处于无效状态。具体来说,它 returns true 如果已设置流的 badbit 或 failbit。

所以,

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

在功能上等同于

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

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