在CPP中,控制符(Manipulator)能够控制输出的格式,使输出更加美观。
Mnanipulator有很多种,
常见的Manipulator有dec,hex,oct,setfill,setprecision,setw以及setiosflags系列......
在实践中,我发现,不同类型的控制符具有不同的作用范围。
这里主要是探索每种Manipulator的作用性质。
注:我用的是visual c++的IDE,可能不适合于GCC标准。
Head file
在使用控制符的时候,必须要加头文件<iomanip>,否则会出现编译错误。
lifespan of the Manipulator
首先我先打这样一段代码:
运行结果如下:
在上面的实验当中,我只使用了setiosflags使用了一次,而使用了setw很多次。
我换了一种格式,程序如图:
输出结果变成了这样:
这就说明,如果将控制符置于输出变量以外的流(cout),那么它的作用范围就是从开始使用到结束(或者下次使用)之前。
值得注意的是,setw控制符不具有这个性质。对于使用的setw 控制符,它的作用范围只是下一个输出。
我们把setw放到了所有输出之前,但是结果却是这样的:
Another initialization
细心的读者一定会问,如果改变了精确度,那么setprecision 的作用范围是什么。
以下是演示:
可以看出,当再次“初始化”精度的时候,前面的精度就作废了。
Relationship
众多的格式符,并不是孤立存在的。
它们有的相互对立,如setiosflags(ios::right/left)、不同精度;
有的,是绑定在一起的。
下面举两个例子。
- 精度固定和精度位数
如果一起用setiosflags(ios::fixed)和setprecision(n)那么我们的输出可以和谐地展示出来,但是若是少了fixed,恐怕setprecision也难成大器了......
- 科学计数法E的大小写
如果我们喜欢用科学计数法来表示数字,那么用setiosflags(ios::uppercase/lowercase)之前要加一个setiosflags(ios::scientific),否则也是无法用大小写表示E了(额......其实系统默认的表示方法是小写E)
若不加scientific,效果如下:
注意了以上的问题,相信你一定可以追求更加完美的输出格式,从而使代码质量更高!!