我试图确认自己对于流如何使用双精度和各种操作符的知识,但是却发现G++做了一些奇怪的事情:
int main() {
double v = 10.0/3.;
//std::cout << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << std::fixed << v << '\n';
}
输出:
3.3 //why is this left aligned?
3.33 //why is this right aligned? which is right?
然后我取消注释了那个第一个cout语句并且得到了不同的结果!
3.33333 //which alignment is this?
3.3 //now this is right aligned?!
3.33 //that implies right-aligned is correct
后续测试表明,第一个双精度流输出是左对齐的,而所有后续的双精度数都是右对齐的:
double v = 10.0/3.;
std::cout << std::setw(10) << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << std::fixed << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << v << '\n';
std::cout << std::setw(5) << std::setprecision(2) << v << '\n';
输出:
3.33333 //well, this is left aligned
3.33
3.3
3.3 //all subsequent tests are right aligned
我猜Coliru上的Clang++也是做同样的事情,因为他们使用了相同的库。
我知道99.9%的情况下答案不是“这是一个G++的bug”,所以有人能解释一下我看到的行为吗?