C++中cout的格式使用详细介绍

1.cout和i/i++/++i的组合使用

i++ 和 ++i 是有着不同的含义,和 cout 组合使用也会得到不同的结果,下面给出一段代码:

#include <iostream>
using namespace std;
int main(){
    int i = 1;
    cout << ++i << i++ << i << i++ << ++i << endl;
    return 0;
}

这段代码的结果是多少呢?
A.23345
B.22335
C.54535
D.53525

我们不妨先理解一下 cout 输出控制台的过程。看下面这幅图:

根据表达式来看, endl 会作为一个可以供 cout 接收的对象往前传,而 ++i 和 endl 结合起来作为一个可以供 cout 接收的对象往前传,依次递推下去。物理实现上需要一个栈来保存可以供 cout 接收的对象,然后从右向左放到这个栈里,然后依次弹出输出在屏幕上。其中, i 和 ++i 会在栈里面保存 i 的引用,而 i++ 会在栈里面保存数字,过程如下:

第一步:将 endl 压入栈中, i 值不变;
第二步:将 i 的引用压入栈中, i 的值加 1 变成 2(因为是 ++i );
第三步:将 2 压入栈中, i 的值加 1 变成 3(因为是 i++ );
第四步:将 i 的引用压入栈中, i 的值不变(因为是 i );
第五步:将 3 压入栈中, i 的值加 1 变成 4(因为是 i++ );
第六步:将 i 的引用压入栈中, i 的值加 1 变成 5(因为是 ++i );
第七步:将栈里的数据依次弹出,即可得到 53525 。(因为i的值是 5 ,所以所有 i 的引用都是 5 )

2.用不同进制输出数字

方法一:用控制符 dec(十进制),hex(十六进制),oct(八进制)

#include <iostream>
using namespace std;
int main()
{
	 int chest = 42;     // decimal integer literal
    int waist = 0x42;   // hexadecimal integer literal
    int inseam = 042;   // octal integer literal
    cout << "Monsieur cuts a striking figure!\n";
    cout << "chest = " << chest << " (42 in decimal)\n";
    cout << "waist = " << waist << " (0x42 in hex)\n";
    cout << "inseam = " << inseam << " (042 in octal)\n";

    chest = 42;
    waist = 42;
    inseam = 42;
    cout << "Monsieur cuts a striking figure!"  << endl;
    cout << "chest = " << chest << " (decimal for 42)" << endl;
    cout << hex;      // manipulator for changing number base
    cout << "waist = " << waist << " (hexadecimal for 42)" << endl;
    cout << oct;      // manipulator for changing number base
    cout << "inseam = " << inseam << " (octal for 42)" << endl;
    // cin.get();                    //有些设备的运行窗口只弹出一下,加上该句可以让窗口停留
    return 0;
}

运行结果:

在默认情况下,cout以十进制格式显示整数

其中,oct 是八进制输出, dec 是十进制(效果和默认一样), hex 是十六进制输出(字母默认是小写字母)。这两个也包含在 std 中,即其全称分别是 std::octstd::decstd::hex ,这三个控制符包含在库 < iostream > 中。

注意:默认格式为十进制,在修改格式之前,原来的格式将一直有效。(修改后的格式一直有效,直到更改它为止)

方法二:使用setbase(n)

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	int i = 123456;
	cout << i << endl;
	cout << dec << i << endl;
	cout <<"八进制:" << oct << i << endl;
	cout <<"十六进制(小写字母):" << hex << i << endl;
	cout << setiosflags(ios::uppercase);
	cout <<"十六进制(大写字母):" << hex << i << endl;
	cout <<"八进制:" << setbase(8) << i << endl;
	cout <<"十六进制:" << setbase(16) << i << endl;
}

setbase(n) 表示以 n 进制显示,包含在库 < iomanip > 中,n 只能取 8, 10, 16 三个值。
setiosflags(ios::uppercase) 表示将字母大写输出,包含在库 < iomanip > 中。
以上均包含在std 命名空间中。

3.调整字段宽度

width函数将长度不同的数字放到宽度相同的字段中,该方法原型为:

int width()

int width(int i)

第一种格式返回字段宽度的当前设置;第二种格式将字段宽度设置为i个空格,并返回以前的字段宽度值。这使得能够保存以前的值以便恢复宽度值时使用。

注意:width()方法只影响接下来显示的一个项目,然后字段宽度将恢复为默认值。

#include <iostream>
using namespace std;
int main()
{
    int w = cout.width(30);
    cout << "default field width = " << w << ":\n";
    int a;
    cout.width(10);
	cout <<cout.width(10) <<endl;			//返回当前字段的宽度 

    cout.width(5);
    cout << "N" <<':';
    cout.width(8);
    cout << "N * N" << ":\n";
    for (long i = 1; i <= 100; i *= 10)
    {
        cout.width(5);
        cout << i <<':';
        cout.width(8);
        cout << i * i << ":\n";
    }
    return 0;
}

也可以使用setw(int n)来设置输出域宽。

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	cout << 's' << setw(8) << 'a' << endl;			//s与a之间有7个空格
	cout << 's' << setw(3) << 'abcd' << endl;
}

setw()只对其后面紧跟的输出产生作用,如上例中,表示'a'共占8个位置,不足的7个位置用空格填充。

若紧跟的输出的内容超过setw()设置的长度,输出结果存在问题。

填充字符

在默认情况下,cout用空格填充字段中未被使用的部分,可以用fill()成员函数来改变填充字符。

控制符包含在库 < iomanip > 中,std 命名空间中。

#include <iostream>
using namespace std;
int main()
{
    cout.fill('*');
    const char * staff[2] = { "Waldo Whipsnade", "Wilmarie Wooper"};
    long bonus[2] = {900, 1350};

    for (int i = 0; i < 2; i++)
    {
        cout << staff[i] << ": $";
        cout.width(7);
        cout << bonus[i] << "\n";
    }
    return 0;
}

注意:与字段宽度不同的是,新的填充字符将一直有效,直到更改它为止。

4.设置浮点数的显示精度

方法一:

C++的默认精度为六位(但末尾的0将不显示)。precision()成员函数使得能够选择其他值,与fill类似,新的精度设置将一直有效,直到被重新设置。

#include <iostream>
using namespace std;
int main()
{
    float price1 = 20.40;
    float price2 = 1.9 + 8.0 / 9.0;

    cout << "\"Furry Friends\" is $" << price1 << "!\n";
    cout << "\"Fiery Fiends\" is $" << price2 << "!\n";

    cout.precision(2);
    cout << "\"Furry Friends\" is $" << price1 << "!\n";
    cout << "\"Fiery Fiends\" is $" << price2 << "!\n";
    return 0;
}

方法二:

前提:包含库 < iomanip > ,这个库包含了对输入输出的控制。

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	double i = 3333.1415926;
	cout << i << endl;
	cout << setprecision(3) << i << endl;
	cout << setprecision(9) << i << endl;
	cout << setiosflags(ios::fixed);
	cout << i << endl;
	cout << fixed << setprecision(3) << i << endl;
	cout << setprecision(9) << fixed <<  i << endl;
}

可以看出,C++默认浮点数输出有效位数是 6 位(若前面整数位数大于 6 位,使用科学计数法输出),而通过以下几种方式可以更改输出精度:
1.使用 setprecision(n) 即可设置浮点数输出的有效位数
(若前面整数位数大于 n 位,使用科学计数法输出)
2.使用 setiosflags(ios::fixed) 或 fixed,表示对小数点后面数字的输出精度进行控制
所以,和 setprecision(n) 结合使用即可设置浮点数小数点后面数字的输出精度,位数不足的补零
以上均采用 “四舍五入” 的方法控制精度,三个控制符均包含在 std 命名空间中。

打印末尾的0和小数

#include <iostream>
using namespace std;
int main()
{
    float price1 = 20.40;
    float price2 = 1.9 + 8.0 / 9.0;

    cout.setf(ios_base::showpoint);
    cout << "\"Furry Friends\" is $" << price1 << "!\n";
    cout << "\"Fiery Fiends\" is $" << price2 << "!\n";

    cout.precision(2);
    cout << "\"Furry Friends\" is $" << price1 << "!\n";
    cout << "\"Fiery Fiends\" is $" << price2 << "!\n";
	// std::cin.get();
    return 0;
}

以上就是C++中cout的格式使用的详细内容,更多关于C++ cout格式的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅析C++中cout的运行机制

    复制代码 代码如下: #include <iostream>using namespace std;int hello1();int hello2(); int main() {    int a, b;    cout<<"a="<<hello1()<<" b="<<hello2()<<endl;    return 0;} int hello1(){    cout<<"

  • 详解C++ cout格式化输出完全攻略

    写算法题的时候突然发现自己忘记基本的C++:cout格式化输出了,赶紧拉出以前的C++学习笔记重新看一看. 部分内容来自教程:C语言中文网(一个很棒的网站) 有时希望按照一定的格式进行输出,如按十六进制输出整数,输出浮点数时保留小数点后面两位,输出整数时按 6 个数字的宽度输出,宽度不足时左边补 0,等等.C语言中的 printf() 函数使用以%开头的格式控制符,例如 %X.%.2f.%6d 等:C++ 中的 cout 对象则使用流操作算子(你也可以叫做格式控制符)或者成员函数进行控制. 使用

  • c++中cin/cout与scanf/printf的区别比较

    cin .cout 基本说明: cin代表标准输入设备,使用提取运算符 ">>" 从设备键盘取得数据,送到输入流对象cin中,然后送到内存. cin是输入流,cout是输出流,重载了">>"."<<"运算符,包含在头文件<iostream>中. 先把要输出的东西存入缓冲区,再输出,导致效率降低,cin是自动判断你的变量类型,比如一个char数据只能用默认的char方法取数据. scanf .prin

  • C++ 中cerr和cout的区别实例详解

    C++ 中cerr和cout的区别实例详解 前言: cerrThe object controls unbuffered insertions to the standard error output as a byte stream. Once the object is nstructed, the expression cerr.flags & unitbuf is nonzero. Example // iostream_cerr.cpp // compile with: /EHsc /

  • C++ 如何用cout输出hex,oct,dec的解决方法

    HEX: 复制代码 代码如下: #include <iostream.h>#include <iomanip.H>main(void){       long n = 10000;       cout << hex << n ;       return 0;} OCT: 复制代码 代码如下: #include <iostream.h>#include <iomanip.H>main(void){       long n = 10

  • C++中cout的格式使用详细介绍

    1.cout和i/i++/++i的组合使用 i++ 和 ++i 是有着不同的含义,和 cout 组合使用也会得到不同的结果,下面给出一段代码: #include <iostream> using namespace std; int main(){ int i = 1; cout << ++i << i++ << i << i++ << ++i << endl; return 0; } 这段代码的结果是多少呢? A.233

  • Java中的main函数的详细介绍

    Java中的main函数的详细介绍 JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,但对于主函数为什么这么写,其中的每个关键字分别是什么意思,可能就不是所有人都能轻松地答出来的了.我也是在学习中碰到了这个问题,通过在网上搜索资料,并加上自己的实践终于有了一点心得,不敢保留,写出来与大家分享. 主函数的一般写法如下: public static void main(String[] args){-} 下面分别解释这些关键字的作用: (1)p

  • sql server数据库中raiserror函数用法的详细介绍

    sql server数据库中raiserror函数的用法 server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误可以被程序捕捉到. raiserror的常用格式如下: raiserror('错误的描述',错误的严重级别代码,错误的标识,错误的描述中的参数的值(这个可以是多个),一些其它参数),在官方上的格式描述如下: RAISERROR ( { msg_id | msg_str | @local_variab

  • C语言中左移和右移运算符详细介绍

    C语言中左移和右移运算符详细介绍 左移运算符(<<) 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位. 右移运算符(>>) 右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0. 对于有符号数,某些机器将对左边空出的部分用符号位填补(即"算术移位"),而另一些机器则对左边空出

  • Android中imageview.ScaleType使用方法详细介绍

    Android中imageview.ScaleType使用方法详细介绍 ScaleType属性用以表示显示图片的方式,共有8种取值: ScaleType.CENTER:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示. ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示. ScaleType.CENTER_INSIDE:将图片大小大于Im

  • C语言中的操作符优先级的详细介绍

    C语言中的操作符优先级的详细介绍 C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用. 下面是来自The C Programming Language 2th的总结. OperatorsAssociativity(结合性) 1. () [] -> . 左->右 2. ! ~ ++ -- + - *(type)sizeof 右->左 3. * / % 左->右 4. + - 左->右 5. << >> 左->右 6

  • Java中的同步与异步详细介绍

    进程同步用来实现程序并发执行时候的可再现性. 一.进程同步及异步的概念 1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事.就像早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成时,就开始吃饭.按照这个定义,其实绝大多数函数都是同步调用(例如sin,isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 sendmessage.该函数发送一个消

  • Java中批处理框架spring batch详细介绍

    spring batch简介 spring batch是spring提供的一个数据处理框架.企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作. 这些业务运营包括: 无需用户交互即可最有效地处理大量信息的自动化,复杂处理. 这些操作通常包括基于时间的事件(例如月末计算,通知或通信). 在非常大的数据集中重复处理复杂业务规则的定期应用(例如,保险利益确定或费率调整). 集成从内部和外部系统接收的信息,这些信息通常需要以事务方式格式化,验证和处理到记录系统中. 批处理用于每天为企业处

  • Spring事务传播中嵌套调用实现方法详细介绍

    目录 前言 7种传播方式 注解式事务 事务的方法之间的调用 注意事项 前言 最近在使用Spring框架时遇到了一些问题,主要是Spring的事务传播问题,一个不带事务的方法调用带事务的方法,有时候会出现不回滚的情况,所以写了这篇文章来记录一下. 7种传播方式 我们先来看Spring事务的7中传播方式以及对应的描述 属性名称 值 描述 PROPAGATION__REQUIRED REQUIRED 表示的是当前这个方法必须运行在一个事务环境中,如果当前方法已经处于事务环境中,就可以直接使用该方法,否

  • vue中eslintrc.js配置最详细介绍

    本文是对vue项目中自带文件eslintrc.js的内容解析, 介绍了各个eslint配置项的作用,以及为什么这样设置. 比较详细,看完能对eslint有较为全面的了解,基本解除对该文件的疑惑. /** * 参考文档 * [eslint英文文档]https://eslint.org/docs/user-guide/configuring * [eslint中文文档]http://eslint.cn/docs/rules/ */ /** * eslint有三种使用方式 * [1]js代码中通过注释

随机推荐