我觉得我问的是一个非常基本的问题,但我无法在这里或在谷歌中找到答案。我记得我们在学校里就学过这一点,但可惜多年来它已经消失了。
为什么cout.precision()
(std::ios_base::precision()
)在输出列表中间调用时会影响整个流吗?我知道这个规则std::setprecision()
应该用于动态改变精度,并且cout.precision()
将会用它返回的值破坏输出。但这的机制是什么呢?是缓冲的原因吗?手册指出这些“做同样的事情”,但根据经验,我发现这并不完全正确。
MCVE:
const double test = 1.2345;
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout << test << endl << cout.precision(3) << test << endl;
// Output:
// 1.234
// 21.234
// after the same init
cout.precision(2);
cout << test << endl << setprecision(3) << test << endl;
// Output
// 1.23
// 1.234
这是“特定于实现/未由标准定义”吗?
请随意将其标记为重复,因为我无法在 SO 上找到它。
函数参数求值的顺序未指定。你打电话时std::cout.precision(n)
的精度std::cout
' 在评估此调用时设置。在你的表情里
cout << test << endl << cout.precision(3) << test << endl;
the cout.precision(3)
显然,被称为编译器完全允许做的第一件事。请记住,编译器认为上面的语句等同于
std::cout.operator<<(test)
.operator<<(std::endl)
.operator<<(std::cout.preision(3))
.operator<<(test)
.operator<< (std::endl);
实际上,编译器函数参数似乎是从右到左计算的。然后才执行不同的移位运算符。因此,在输出完成之前精度会发生变化。
使用操纵器,例如std::setprecision(n)
避免依赖于子表达式的求值顺序:从以下位置创建的临时表达式std::setprecision(n)
无论何时都会被创建。然后,当调用适当的移位运算符时,就会应用该效果。由于必须以适当的顺序调用移位运算符,因此操纵器的使用发生在已知的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)