目前我正在自学C++ Primer 5th.这是我不确定的事情.(我在FAQ上找不到确切的相关问题).
考虑这个while循环:
while(std::cin>>value){...} \\value here was defined as int.
教科书上写道:
该表达式从标准输入中读取下一个数字,并将该数字存储在值中.输入运算符(第1.2节,第8页)返回其左操作数,在本例中为std :: cin.因此,这个条件测试std :: cin.当我们使用istream作为条件时,效果是测试流的状态.如果流是有效的 - 也就是说,如果流没有遇到错误 - 则测试成功.
我的问题是:首先std::cin
读入输入value
然后测试验证std::cin
,或std::cin
首先测试然后决定是否读入'值'?当它"返回它的左操作数"时,我很困惑.
请记住,您的代码相当于:
while (std::cin.operator>>(value)) { }
要么:
while (1) { std::cin >> value ; if (!std::cin) break ; }
"代码"总是试图从读std::cin
入value
前的测试std::cin
.
我们来看看报价:
[...]输入运算符(第1.2节,第8页)返回其左操作数,在本例中为std :: cin.[...]
这只意味着std::cin.operator>>(value)
回归std::cin
.
因此,这个条件测试std :: cin.当我们使用istream作为条件时,效果是测试流的状态.如果流是有效的 - 也就是说,如果流没有遇到错误 - 则测试成功.
什么书文说,试图读取一个整数后std::cin
到value
,在>>
运营商的回报std::cin
.如果std::cin
读完后处于良好状态value
,则测试通过,否则失败.
一些额外的细节:
当你这样做时std::cin >> value
,你基本上调用了istream::operator>>(int&)
,是的,在该方法中有一个测试:如果测试通过,则内部状态std::cin
设置为ios_base::goodbit
,如果失败,则内部状态设置为错误标志(eofbit
,failbit
或badbit
)的on .
根据exception mask
for std::cin
,如果内部测试失败,则可能抛出异常.
从你的报价:
当我们使用istream作为条件时,效果是测试流的状态.
这基本上意味着:
if (std::cin) { }
是等价于:
if (!std::cin.fail()) { }
并std::cin.fail()
检查failbit
或badbit
.这意味着while (std::cin >> value) { }
不会测试eofbit
标志,只有在输入无法转换为整数值时才会失败.