目前,我正在自学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
to读取一个整数之后value
,>>
操作符返回std::cin
。如果std::cin
读取后处于良好状态value
,则测试通过,否则它将失败。
一些额外的细节:
当你这样做std::cin >> value
,你基本上调用istream::operator>>(int&)
,并且是有一个测试里面那个方法:如果测试通过,那么的内部状态std::cin
被设定为ios_base::goodbit
,如果失败,内部状态被设定为在错误标志的(eofbit
,failbit
或badbit
) 。
取决于exception mask
for std::cin
,如果内部测试失败,则可能引发异常。
从您的报价:
当我们使用istream作为条件时,其作用是测试流的状态。
这基本上意味着:
if (std::cin) { }
是等价于:
if (!std::cin.fail()) { }
并std::cin.fail()
检查failbit
或badbit
。这意味着while (std::cin >> value) { }
不会测试该eofbit
标志,并且只会在无法将输入转换为整数值时失败。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句