【问题标题】:what does if(! (is >> s)) mean?if(! (is >> s)) 是什么意思?
【发布时间】:2018-05-02 03:48:56
【问题描述】:

这是一个重载的>>operator 函数:

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

据我了解,if(! (is &gt;&gt; s)) 没有任何意义,因为终端或控制台会等到来自键盘或其他来源的输入输入s。所以if() 中的条件值最终将是false。谁能帮忙?

【问题讨论】:

  • 必须读作“如果is不能读取字符串”。
  • 那个代码太密集了。应该分两部分写:is &gt;&gt; s; if (!is)....

标签: c++ operator-overloading iostream


【解决方案1】:

is &gt;&gt; s 尝试从流 is 中读取字符串 s

istreams operator&gt;&gt;() 返回对is 的引用。

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

所以,

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

在功能上等同于

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

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

【讨论】:

  • 我认为这篇文章很详尽,但其他人也对我有用,谢谢! :)
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      你在一行中做很多事情

      ! (is >> s)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        相关资源
        最近更新 更多