C++ 为什么cout.precision()会影响整个流?
我觉得我在问一个非常基本的问题,但我在这里或谷歌上都找不到答案。我记得我们在学校里学过这门课,但遗憾的是,这门课多年来已经消失了 <>代码为什么在输出列表中间调用整个流?我知道应该使用C++ 为什么cout.precision()会影响整个流?,c++,iostream,c++-standard-library,C++,Iostream,C++ Standard Library,我觉得我在问一个非常基本的问题,但我在这里或谷歌上都找不到答案。我记得我们在学校里学过这门课,但遗憾的是,这门课多年来已经消失了 代码为什么在输出列表中间调用整个流?我知道应该使用std::setprecision()动态更改精度的规则,并且cout.precision()将破坏它返回的值的输出。但这是什么机制呢?这是因为缓冲吗?手册上说这些“做同样的事情”,但从经验上我可以看出这并不完全正确 MCVE: const双重测试=1.2345; cout.setf(ios::fixed); cout
std::setprecision()
动态更改精度的规则,并且cout.precision()
将破坏它返回的值的输出。但这是什么机制呢?这是因为缓冲吗?手册上说这些“做同样的事情”,但从经验上我可以看出这并不完全正确
MCVE:
const双重测试=1.2345;
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
计算精度(2);
cout在第一个示例中计算cout.precision(3)
的准确时间没有定义,因为它的值用作函数调用的参数。对于第二个示例,将setprecision(3)
插入到流中的时间定义非常明确,即插入endl
之后和测试之前(第二次)。因此,第一个版本不会产生可靠的结果(在不同的实现中得到的结果可能不同),但第二个版本会
有关更详细的说明,请参阅。(这里的问题没有使用运算符,但原理是一样的——在另一个函数的返回值上调用成员函数。)函数参数求值的顺序未指定。调用std::cout.precision(n)
时,std::cout
的精度将在评估此调用时设置。用你的表情
cout << test << endl << cout.precision(3) << test << endl;
实际上,编译器函数参数的计算似乎是从右向左的。然后才执行不同的移位运算符。因此,在输出完成之前,精度会发生变化
像std::setprecision(n)
这样的操纵器的使用避免了依赖于计算子表达式的顺序:从std::setprecision(n)
创建的临时表达式将在任何时候创建。然后在调用相应的移位运算符时应用该效果。由于必须按适当的顺序调用移位运算符,因此操纵器的使用发生在已知的位置。太好了,太详细了!但是,代码行之间是否有输入错误?看起来像一个operator那么,我是否正确理解setprecision()
的效果正是因为它返回了一个临时对象,其创建点和调用点在时间上是分开的?@iksemyonov:我想所有的操作符调用都在那里,但有一个实际上是错误的(它实际上也是一个成员)。是的,std::setprecision(n)
创建一个临时变量,该变量使用一个操作符“插入”到流中,而该操作符过去对此一无所知!阅读。
cout << test << endl << cout.precision(3) << test << endl;
std::cout.operator<<(test)
.operator<<(std::endl)
.operator<<(std::cout.preision(3))
.operator<<(test)
.operator<< (std::endl);