首个使用 double 的 setw 左对齐,后续右对齐。

4

我试图确认自己对于流如何使用双精度和各种操作符的知识,但是却发现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”,所以有人能解释一下我看到的行为吗?


就我所知,我没有看到你所说的对齐行为。我使用的是g++ 4.7.3。我认为你应该明白为什么得到小数点后不同数量的数字。 - R Sahu
@RSahu:是的,我理解不同数字长度的问题,只是对齐方式让我感到困惑。 - Mooing Duck
1个回答

2
在其他 IDE 上运行后,我得出结论,这不是 g++/clang++ 的问题,也不是任何标准行为的问题,而是 Coliru 编辑器本身的问题。我在几个不同的网站上运行了这个程序,包括 RextesterIdeone,它们都输出了正确的结果。这似乎只是 Coliru 编辑器的问题。
流默认是右对齐的。当使用 std::setw() 设置宽度时,流将根据 out.fill() 指定的填充字符将填充字符插入到输出流的开头(或结尾)。我注意到,当流使用默认填充字符(一个简单的空格)时,Coliru 在第一次输出操作时不会添加任何填充字符。但是当我将填充字符更改为除空格以外的任何字符时,它就能正常工作

http://coliru.stacked-crooked.com/a/dd835f3a39162ee1 证实了前导空格被消耗。然而,我对“流默认是左对齐的”这一说法表示怀疑,因为它们似乎默认情况下是右对齐的。 - Mooing Duck
@MooingDuck 是的,流默认是右对齐的,我的错。 - David G
2
更简洁的 Coliru 错误测试用例:http://coliru.stacked-crooked.com/a/1e63d96d6b0d419d - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接