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
中必须产生一个逻辑值 true
或 false
。 This Q&A 解释了它在不同版本的 C++ 中是如何完成的。本质上,当操作成功时,std::istream
评估为真条件。
现在您知道了 is >> s
的含义,您可以发现添加一个否定会翻转该含义: !(is >> s)
只有在从 [= 读取 s
时才为真12=] 不成功。对于字符串,不成功的读取意味着流处于无效状态,例如,因为已到达流的末尾。
is >> s
尝试从流 is
中读取字符串 s
。
istream
s operator>>()
returns 对 is
.
的引用
istream
s 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。请注意,这与到达流的末尾不同。
这是一个重载的>>
运算符函数:
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
中必须产生一个逻辑值 true
或 false
。 This Q&A 解释了它在不同版本的 C++ 中是如何完成的。本质上,当操作成功时,std::istream
评估为真条件。
现在您知道了 is >> s
的含义,您可以发现添加一个否定会翻转该含义: !(is >> s)
只有在从 [= 读取 s
时才为真12=] 不成功。对于字符串,不成功的读取意味着流处于无效状态,例如,因为已到达流的末尾。
is >> s
尝试从流 is
中读取字符串 s
。
istream
s operator>>()
returns 对 is
.
istream
s 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。请注意,这与到达流的末尾不同。