Des*_*ard 5 c++ cin operator-precedence
目前我正在自学C++ Primer 5th.这是我不确定的事情.(我在FAQ上找不到确切的相关问题).
考虑这个while循环:
while(std::cin>>value){...} \\value here was defined as int.
Run Code Online (Sandbox Code Playgroud)
教科书上写道:
该表达式从标准输入中读取下一个数字,并将该数字存储在值中.输入运算符(第1.2节,第8页)返回其左操作数,在本例中为std :: cin.因此,这个条件测试std :: cin.当我们使用istream作为条件时,效果是测试流的状态.如果流是有效的 - 也就是说,如果流没有遇到错误 - 则测试成功.
我的问题是:首先std::cin读入输入value然后测试验证std::cin,或std::cin首先测试然后决定是否读入'值'?当它"返回它的左操作数"时,我很困惑.
Hol*_*olt 12
请记住,您的代码相当于:
while (std::cin.operator>>(value)) { }
Run Code Online (Sandbox Code Playgroud)
要么:
while (1) {
std::cin >> value ;
if (!std::cin) break ;
}
Run Code Online (Sandbox Code Playgroud)
"代码"总是试图从读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 maskfor std::cin,如果内部测试失败,则可能抛出异常.
从你的报价:
当我们使用istream作为条件时,效果是测试流的状态.
这基本上意味着:
if (std::cin) { }
Run Code Online (Sandbox Code Playgroud)
是等价于:
if (!std::cin.fail()) { }
Run Code Online (Sandbox Code Playgroud)
并std::cin.fail()检查failbit或badbit.这意味着while (std::cin >> value) { }不会测试eofbit标志,只有在输入无法转换为整数值时才会失败.