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);