Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果(!(is>;>;s))是什么意思?_C++_Operator Overloading_Iostream - Fatal编程技术网

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

C++ 如果(!(is>;>;s))是什么意思?,c++,operator-overloading,iostream,C++,Operator Overloading,Iostream,这是一个重载的>运算符函数: std::istream& operator>>(std::istream& is, std::vector<int>& v){ string s; if (! (is >> s) ) return is; ... return is; } std::istream&operator>>(std::istream&is,std::vector&v){ 字符串s; 如果(!(is>

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

std::istream& operator>>(std::istream& is, std::vector<int>& v){
  string s;
  if (! (is >> s) )
    return is;
   ...
  return is;
}
std::istream&operator>>(std::istream&is,std::vector&v){
字符串s;
如果(!(is>>s))
回报是;
...
回报是;
}

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

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

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

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

std::vector<std::string> strings;
ss >> strings; // should be empty!
std::string s;//空的!
标准::stringstream ss(s);
std::向量字符串;
ss>>字符串;//应该是空的!

您在一行中做了很多事情

! (is >> s)

您获取inputstream并使用它来分配对象s,在if条件下对s的结果进行求值以了解
if(!(is>>s))
意味着您需要了解
if(is>>s)
意味着什么

由于
is
std::istream
,因此操作员
>
返回
std::istream
。因此,
is>>s
是一个
std::istream
,它在
if
中必须产生一个逻辑值
true
false
。解释它是如何在C++的不同版本中完成的。本质上,当操作成功时,
std::istream
计算结果为真实条件


既然您知道了
is>>s
的含义,那么您就可以明白添加否定会颠覆这一含义:
!(is>>s)
只有在从
is
读取
s
失败时才会为真。对于字符串,读取不成功意味着流处于无效状态,例如,因为已到达流的结尾。

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

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

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

所以

在功能上等同于

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

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

必须将其读取为“if
is
无法读取字符串”。该代码太密集。它应该由两部分组成:
is>>s;如果(!is).
。我觉得这篇文章很详尽,但其他文章也给我提供了信息,谢谢!)
 is >> s;
 if (is.fail()) return is;    // is.fail() returns true if failbit or badbit are set