代码之家  ›  专栏  ›  技术社区  ›  Finley

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

  •  2
  • Finley  · 技术社区  · 7 年前

    这是一个过载的 >> 操作员功能:

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

    据我所知, if(! (is >> s)) 没有意义,因为终端或控制台将等待来自键盘或其他来源的输入进入 s . So中条件的值 if() 最终将是 false . 谁能帮忙?

    4 回复  |  直到 7 年前
        1
  •  3
  •   Peter    7 年前

    这个 is >> s 尝试读取字符串 s 来自流 is .

    istream s operator>>() .

    istream公司 operator!() 测试流是否处于无效状态。具体来说,它返回 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
    

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

        2
  •  2
  •   xtofl Adam Rosenfield    7 年前

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

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

    std::string s; // empty!
    std::stringstream ss(s);
    
    std::vector<std::string> strings;
    ss >> strings; // should be empty!
    
        3
  •  1
  •   Sergey Kalinichenko    7 年前

    了解什么 if (!(is >> s)) 意味着你需要了解什么 if (is >> s) 方法

    自从 is 是一个 std::istream 操作人员 >> 返回一个 标准::istream . 因此 is >> s 标准::istream ,它位于 if 必须生成逻辑值 true false . This Q&A 解释了如何在不同版本的C++中实现。基本上, 标准::istream 当操作成功时,评估为真实条件。

    is>&燃气轮机;s ,您可以发现添加否定会翻转这一含义: !(is >> s) 只有在阅读 s 从…起 不成功。对于字符串,读取不成功意味着流处于无效状态,例如,因为已经到达流的末尾。

        4
  •  -1
  •   ΦXocę 웃 Пepeúpa ツ    7 年前

    你在一条线上做了很多事情

    ! (is >> s)
    

    获取inputstream并使用它分配对象s,即在if条件下评估s的结果