此代码片段:
//
// This is example code from Chapter 11.2.5 "Fields" of
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << 123456 // no field used
<<'|'<< setw(4) << 123456 << '|' // 123456 doesn't fit in a 4 char field
<< setw(8) << 123456 << '|' // set field width to 8
<< 123456 << "|n"; // field sizes don't stick
}
产生以下输出:
123456|123456| 123456|123456|
123456
的第二个印刷品没有被截断以适合宽度为4的字段,Stroustrup解释说这是正确的做法,因为一个有正确数字的看起来不好的表比一个有错误数字的看起来好的表要好。
C++标准对这种行为有何规定?
我找到了ios_base::width
,标准上写着:
在特定输出转换
"最低限度"是用来解释上述行为的关键词吗?
您引用的语句是一个通用描述。不管是什么在输出时,字段将至少有那么多字符;就是最小值的意义。字段的确切含义取决于正在输出的数据类型。在整数输出的情况下格式见§22.4.2.2;这不仅包括宽度字段被解释,并保证字段不会更大除非需要根据指定的格式显示值,还包括填充使用的字符以及放置位置。(Stroustrup的例子留下了所有其他参数默认值,但如果您有负数,并指定了填充字符"0",您不希望它导致|000-1234|
,但是而不是|-0001234|
。(
对于用户定义的类型,字段完全可能包含小于最小值。我会认为这是一个bug,但我想很多的用户定义的CCD_ 5,而不考虑格式化参数。std::setw
的实际效果仅为CCD_ 7类中的字段;这取决于实现CCD_ 8以正确处理它。