跳转到内容

数据类型

学习一门编程语言,首先要掌握它的数据类型。不同的数据类型占用的内存空间不一样,合理定义数据类型可以优化程序的运行。

1. 第一个C++程序

先来看一个简单的程序示例,经典的“Hello World!”。

cpp
#include<iostream>                    // 包含iostream.h的头文件
using namespace std;                  // 使用std命名空间
int main() {                          // 主函数main入口
  cout << "Hello World!" << endl;     // 输出语句 Hello World!
  return 0;
}

在这个简单的程序中,出现了头文件、命名空间、主函数、输出语句、字符串常量、注释等概念,下面来一起认识一下。

1.1 #include 头文件

C++程序中,带‘#’号的语句称为预编译命令,该命令会在程序编译之前进行。include的含义是“包含”和“引用”,#include命令则为包含头文件命令,表示本程序将嵌入指定的头文件。

所谓头文件,指的是程序中用于声明函数,变量、宏等的文件,通常以.h结尾。使用头文件(包括系统头文件和自定义头文件)可以方面地引用已经写好的代码,提高代码的复用性和可维护性,同时降低代码的耦合度,使代码更加模块化。

因此第一行代码“#include<iostream>”表示包含C++标准输入输出流头文件 iostream.h,也就是说,程序编译时会在此将iostream.h头文件中的内容展开

1.2 命名空间(namespace)

一个中大型的软件往往有多名程序员开发,会使用大量的常量、变量、函数、结构体、枚举、类等,因此不可避免地会出现命名冲突的问题。工程越大,命名互相冲突的可能性就越大。为了方便的解决这个问题,C++引入了 命名空间 的概念。在不同的命名空间里,同名变量放在一起编译不会出现问题。

因此第二行代码 using namespace std; 表示使用C++标准库定义的 std 命名空间。

1.3 主函数 main()

main() 函数又称为主函数,是C++程序的执行入口。程序将从 main() 函数的第一行开始执行,主函数执行结束,整个程序也就执行结束了。其中,main为函数名“()”里可以放置参数。

int main()是函数的函数头,表示main()函数将返回一个整数的数据类型结果;大括号 {} 中的内中是需要执行的函数体。函数体中,各行代码将按照先后顺序依次执行,从上到下依次执行。

1.4 输出流语句

“cout << "Hello World!"”,表示通过数据输出流,输出英文“Hello World!”。其中双引号代表该语句是字符串常量,cout 表示输出流,<< 表示将字符串传入到输出流中。

注意

C语言中,使用scanf()、printf()函数进行数据的输入和输出操作。C++兼容C语言。因此这两个格式化输入和输出函数在C++中仍然可以使用。但是C++提供了一套全新的、更容易使用的输入输出库, 即使用 cout << 输出,cin >> 输入。

1.5 注释

代码中使用了多处“//”注释,对本行代码进行解释说明。编译器不会对注释部分进行编译。C++程序中有两种注释方法:单行注释 //, 多行注释 /* */。

2. 关键字和标识符

关键字又称保留字,是C++中规定具有特殊意义的字符串,用户定义的常量、变量、函数等名称不能与保留字相同,否则会出错。

asmautobreakcasecatchcharclassconstcontinue
defaultdeletedodoubleeleseenumexternfloatfor
friendgotoifinlineintlongnewoperatoroverload
privateprotectedpublicregisterreturnshortsignedsizeofstatic
structswitchthistemplatethrowtrytypedefunionunsigned
virtualvoidvolatilewhile

提示

这些关键字(保留字)不需要背诵,在开发环境编写代码中,关键字会以特殊的颜色显示。在后续学习中,会逐渐熟悉这些关键字的用法,不需要死记硬背

标识符:是对C++程序中变量、常量、语句标号以及用户自定义函数等名称进行标识的符号。其名称规则如下:

  • 标识符必须以字母、数字以及下划线组成,且不能以数字开头
  • C++大小写敏感,因此大写和小写英文相同的英文字母代表不同的标识符
  • 标识符不能是关键字
  • 标识符应该体现功能含义,便于理解(推荐但不强制)

3. 基本数据类型

C++包括整型、浮点型、字符型、布尔型等基本数据类型,数组、结构体、共同体等构造数据类型,指针类型,以及用户自定义数据类型。C++能够实现复杂的数据结构,还可以定义类,实现面向对象编程。

基本数据类型:

整数类型:短整型(short)、整型(int)、长整型(long)、long long(非常大的整型)。

实数类型(浮点数类型):单精度(float)、双精度(double)。

字符类型:char。

布尔类型:bool。

4. 常量

程序运行的过程中,其值不能改变的量为常量。常量包含整型常量、浮点型常量、字符常量、字符串常量等。

小栗子:

cpp
#include<iostream>
using namespace std;
int main() {
  cout << 2025 << endl; // 输出整数
  cout << 3.14 << endl; // 输出小数
  cout << 'a'  << endl; // 输出字符
  cout << "Hello World!" << endl; // 输出字符串
  return 0;
}

4.1 整型常量

整型常量就是整型常数(没有小数部分),如123、-7、0等。编写代码时,可将整型常量表示为十进制、八进制和十六进制三种表示方式。

  • 十进制:日常见到的整数都是十进制。十进制数使用0-9来表示所有数,递进关系为逢十进一,除了0本身之外,其他十进制不能以0开头
  • 八进制:使用0-7表示所有数,递进关系是逢八进一。八进制常量前要加上0作为前缀,如0123、0432等
  • 十六进制:使用0-9和字母a-f或(A-F)来表示所有数,递进关系为逢十六进一。十六进制常量前要加上0x或0X作为前缀,如0x123、0X3b4a等

4.1 浮点型常量

浮点型(又称为实型)常量就是我们常见的小数,只能采用十进制形式表示。表现形式有两种小数表示和指数表示。

1、小数表示法

小数表示法由整数部分和小数部分组成,中间用小数点分割。例如,0.0、2.25、-0.002等都是合法的实型常量。

另外整数部分和小数部分可以省略一处,例如,.2表示小数0.2,2.表示小数2.0。

2、指数表示法

指数表示又称科学计数法,指数部分以e或者E开始,后面跟整数。

1.2e20表示 1.2 X 10^20

提示

在字母e(或E)之前的小数部分中,小数点左边应有且只有一位非零的数字,成为规范化的指数形式。

4.2 字符常量

使用一对单引号括起来的字符就是字符常量,如 'a'、'A'、'?'等。编译代码时,编译器会根据ASCII码表将对应字符常量转化为整型常量。其中'a'对应的是97,'A'对应的是65。

除了这些固定字符,ASCII码表中还有很多转义字符,转义字符是一类特殊的字符常量,通常以反斜杠 "\" 开头,后面跟一个或多个字符。下面是一些常用的转义字符以及对应的意义。

转义字符意义ASCII码转义字符意义ASCII码
\0空字符0\反斜杠93
\n换行10\'单引号字符39
\t水平制表9\"双引号字符34
\b退格8\a响铃7
\r回车13\f换页12
\ddd1~3位八进制数代表的字符\xhh1~2位十六进制数代表的字符

4.2 字符串常量

字符串常量是用一对双引号括起来的字符序列。例如 "Hello World!"、"Welcome to learn C++!!!"都是合法的字符串常量。其中,""表示一个空字符串,此时字符串的长度为0。

字符串常量实际上是一个字符数组,可以将字符串分割为若干个字符,字符的数量就是字符串的长度。字符串常量一般用来给字符数组变量赋值或是直接作为实参传递,为告知编译器字符串已经结束,一般再给字符串数组赋值时在字符串的末尾加上字符'\0',表示字符结束。如果不加可能会导致意想不到的错误。

提示

字符'A'和字符串"A"含义不同。内存中,字符'A'只包含一个字符:字符串"A"其实是"A\0"两个字符组成,字符串长度为2。

4.3 其他常量

除了整型、浮点型、字符型、字符串型常量外,还存在布尔常量、枚举常量和宏定义常量等。

  • 布尔常量:布尔类型时表示是否、对错等真假值判断的数据类型,常用在逻辑判断中。布尔值类型只有true和false两个取值。true表示真,其值是1、false表示为假,其值是0
  • 枚举常量:枚举型数据中定义的数据都是常量
  • 宏定义常量:通过#define宏定义的值也是常量

5. 变量

变量是指在程序运行期间其值可以发生改变的量。每个变量都必须有一个名称作为唯一标识,且具有一个特定的数据类型。变量使用之前,一定要先声明或定义。

5.1 变量的声明和定义

C++中,变量声明式指为变量提供一个名称,并告诉编译器这个变量将被使用,但不会为其分配内存空间。变量声明形式一般是:数据类型 变量名;

其中数据类型指变量的类型,如整型、浮点型、字符型,变量名则是用户给变量起的名称,必须符合标识符的命名规则。

多个同一类型的变量可以再一行中声明,变量名称之间用逗号隔开。

cpp
int a;
int x, y, z;

定义变量时需要为变量分配一块内存空间,以储存其值。语法是:数据类型 变量名 = 变量值;

注意!

定义多个赋相同初始值的变量时,应写成 int x = 2, y = 2, z = 2;,不能写成 int x = y = z = 2;形式。

5.1 整型变量

整型变量就是用来储存整型的变量。

根据内存的空间大小,整型变量可以分为基本整型(int)、短整型(short)和长整型(long)3类。根据是否有符号,还可以分为有符号整型(signed)和无符号整型(unsigned)2类。因此整型变量可以分为6类如下表。

类型关键字简化形式类型关键字简化形式
整型[signed]intint无符号整型unsigned[int]unsigned
短整型[signed]short[int]short无符号短整型unsigned short [int]unsigned short
长整型[signed]long[int]long无符号长整型unsigned long [int]unsigned long

不同的整型,其内存所占用的字节空间不同,因此可表示的变量数值范围也不同。

关键字类型字节数数值范围
short短整型2-32768 ~ 32767,即-2^15 ~ 2^15-1
ungigned short无符号短整型20 ~ 65535, 即2^16-1
int整型4-2147483648 ~ -2147483647,即 -2^31 ~ 2^31-1
unsigned int无符号整型40 ~ 4294967295,即 0 ~ 2^32-1
long长整型4-2147483648 ~ -2147483647,即 -2^31 ~ 2^31-1
unsigned long无符号长整型40 ~ 4294967295,即 0 ~ 2^32-1

例如,下面定义了一个整型变量a,为它分配了4个字节的空间,并设初始值为10。

cpp
int a = 10;

变量赋值时,整型常量后面可以加上L或l、U或u等后缀,清晰指明其类型。

警告

根据CPU寄存器位数和编译器的不同,最大的整型数值也不同。32为操作系统中,基本整型为4个字节,长整型为4个字节;64为操作系统中,基本整型为4个字节,长整型为8个字节。

说明

C++程序中,布尔型(bool)被当做整型对待,false表示0,true表示1.因此将布尔类型赋值给整型是合法的,将整型赋值为布尔类型也使合法的。

5.2 浮点型变量

浮点型变量分为单精度(float)、双精度(double)和长双精度(long double)3类。

关键字类型字节数数值范围
float单精度41.17*10^-18 ~ 3.4*10^38
double双精度82.22*10^-308 ~ 1.79*10^308
long double长双精度83.36*10^-4293 ~ 1.18*10^4293

float和double相比,double类型的变量具有更高的精度,即它可以表示更多的小数位。float保留到小数点后7位,有效数字为6~7位;double保留到小数点后16位,有效数字为15~16位。实际开发中一般都是用double,尽可能避免精度缺失。

在程序中使用浮点型数据时,需要注意一下两点。

1、浮点型数据相加

浮点型数据的有效数字是有限的,如float的有效数字是6或7位,如果将数字86041238.78赋值给float类型,显示的数字是86041240.00,个位数8被四舍五入,小数位被忽略。如果将86041238.78与5相加,输出的结果为86041245.00,而不是86041243.78。

2、浮点型数据与零进行比较

在开发中,经常会进行两个浮点型数据进行比较,此时尽量不要使用==!=运算符,而应使用>=<=之类的运算符。

如下代码直接将浮点型变量与0比较,不是提高代码质量。如果程序要求的精度非常高,可能会产生未知的结果。

cpp
float fvar = 0.00001;
if(fvar == 0.0)

通常做法是:定义0的精度,然后判断该浮点数是否在其精度内。

cpp
#include<iostream>
int main() {
  float eps = 0.0000001;
  float fvar = 0.00001;
  if(fvar >= -eps && fvar <= eps) {
    std::cout << "等于0";
  }else {
    std::cout << "不等于0";
  }
  return 0;
}

警告

数字里可以有下划线,这些下划线不会影响数值,仅提供分割作用,方面阅读。下划线不能在数字开头或结尾,二进制和十六进制前缀字母旁,以及小数点旁。

5.3 变量赋值

变量是可以动态改变的,每次改变都需要进行赋值。赋值情况如下。

变量名 = 变量值;

其中,表达式由运算符、操作符、括号等组成。最简单的表达式就是一个数。

cpp
int i;
i = 100;

5.4 字符型变量

char关键字用来定义字符型变量,其内存占一个字节。

cpp
char ch;
ch = 'A';

字符型变量在内存中存储的是字符的ASCII码,即一个无符号整数。其形式与整型变量的存储形式一样,因此字符型数据与整型数据直接可以通用。

  • 一个字符型数据,既可以以字符形式输出、也可以以整数形式输出
  • 允许对字符数据进行算术运算

警示

给char型变量赋值时不能使用三个单引号,否则编译器会无法识别开始和结束位置。

6. 数据输入与输出

在用户与计算机进行交互的过程中,数据输入与输出是必不可少的过程。计算机需要通过输入获取用户的操作指令,并通过输出显示操作结果。

6.1 C++中的流

C++中,数据的输出和输出发生在标准输入/输出设备(键盘/显示器)、外部存储介质(磁盘文件),以及内存空间之间。因此,对键盘和显示器的输入/输出简称“标准I/O”,对磁盘文件的输入/输出简称“文件I/O”,对内存空间的输入和输出简称“串I/O”。

C++把数据之间的这种传输操作称为流,意思是数据传输过程像流水一样从一个地方流向另一个地方,实现输入的为输入流,实现输出的为输出流。流既可以表示从内存传送到某个载体或设备中,也可以表示数据从某个载体或设备传送到内存缓冲区中。程序用流统一对各种计算机设备和文件进行操作,使程序与设备、文件无关,提高了程序设计的通用性和灵活性。

C++定义了ios基类,以及由其派生的输入流类istream和输出流类ostream。标准的“I/O”操作有四个类对象,分别是cincoutcerrclog。其中,cin代表标准输入设备(键盘),也称cin流或标准输入流;cout代表标准输出设备(显示器),也称cout流或标准输出流。当进行键盘输入操作时使用cin流;当进行显示器输出操作时,使用cout流;当进行错误信息输出时,使用cerrclog流。

C++数据通过重载运算符>><<执行输入和输出操作。输出操作使用<<向流中插入一个字符序列,输出操作使用>>从流中提取一个字符序列。

1. cout语句

cout语句一般格式为:cout << 表达式1 << 表达式2 << 表达式n;

cout代表显示器,cout << x;操作相当于把x的值输出到显示器。

先把x的值输出到显示屏幕上,在当前屏幕光标位置显示出来,然后cout流恢复到等待输出的状态,以便继续通过插入操作输出下一个值。当使用插入操作向一个流输出某个值后,再输出下一个值时将被放在上一个值的后面,所以为了让流中前后两个值分开,可以在输出一个值后接着输出一个空格,或换行符,或其他需要的字符或字符串。

cpp
cout << "Hello World" << endl;

可以简单的写成多行

cpp
cout << "Hello"
<< " "
<< "World"
<< endl;

也可写成多个cout语句

cpp
cout << "Hello";
cout << " ";
cout << "World";
cout << endl;

2. cin语句 cin语句一般格式为:cin >> 变量1 >> 变量2 >> 变量n;

cin代表键盘,执行cin >> x;就相当于把键盘输入的数值赋值给变量x。

通过键盘输入数据时,只有输入完整数据并按下Enter键之后,系统才会把该行数据存入键盘缓冲区,供cin流顺序读取给变量赋值。另外从键盘上输入的每个数据之间必须用空格或Enter分开,因为cin为一个变量读入数据时是以空格或Enter键作为其结束标志的。

当 cin >> x; 操作中的x为字符指针类型时,则要求从键盘的输入中读取一个字符串,并把它赋值给x指向的内存空间。若x没有事先指向一个允许写入信息的存储空间,则无法完成输入操作。另外从键盘上输入的字符串,其两边不能带有双引号定界符,若有则只作为双引号字符看待。对于输入的字符也是如此,不能带有单引号定界符。

小栗子:写一段代码,将用户的输入的数字打印出来(假设用户输入的数字范围在整型范围内),其中endl用于向流的末尾加入换行符。

查看结果
cpp
#include<iostream>
int main() {
	int i;
	std::cout << "请输入一个数字" << std::endl;
	std::cin >> i;
	std::cout << "您输入的数字是:" << i << std::endl;
	return 0;
}

6.3 格式化输出

1. 流输出(cout) cout是输出流ostream的对象,通过其中的函数可以对数据进行格式化输出。

ostream类的成员函数:

成员函数说明
flags(f)当前格式状态全部替换为f
setf(f1,f2)在当前格式的基础上,追加f1格式,并删除f2格式,其中,f2格式可以省略
unsetf(f)在当前格式的基础上删除f格式
width(w)设置数据的输出域宽为w
fill(c)当数据小于输出域宽时,用字符c填充(默认情况下用空格填充)
precision(n)设置浮点数的输出精度为n

格式化常量:

格式说明
ios::dec以十进制形式输出整数,此为默认输出格式
iso::oct以八进制形式输出整数
ios::hex以十六进制形式输出整数
ios::fixed以普通小数格式输出浮点数
ios::scientific以科学计数法形式输出小数
ios::left当数据小于输出域宽时,居左对齐,填充字符添加到右边
ios::right当数据小于输出域宽时,居右对齐,填充字符添加到左边
ios::internal数值的符号位在域宽内左对齐,其数值右对齐,中间由填充字符填充
ios::showbase强制输出整数的基数,八进制数前显示0,十六进制数前显示0x
ios::uppercase字母用大写表示,十六进制数中使用A ~ E,前缀使用0X,科学计数法使用E
ios::boolapha把true和false转化为字符串(默认情况下为1和0)
ios::unitbuf输出后刷新所有的流

这些成员函数使用时,前面要加上cout对象名,如cout.setf(ios::left)、cout.width(5)等。另外,可以同时设置多个输出格式,不同格式用 | 连接。例如,数据输出时要求左对齐且字母大写,输出格式为cout.setf(ios::left|ios::uppercase)。

另外,C++标准库提供的iomanip.h头文件中包含了大量的格式控制符,可以直接使用它们进行数据格式化输出,更加简单、快捷。与格式化常量非常相似,但可以设置的格式更多。

C++格式控制符

格式控制符作用/
dec以十进制形式输出整数常用
oct以八进制形式输出整数常用
hex以十六进制形式输出整数常用
fixed以普通小数形式输出浮点数常用
scientific以科学计数法输出浮点数常用
left当数据小于输出域宽时,居左对齐,填充字符添加到右边常用
right当数据小于输出宽域时,居右对齐,填充字符添加到坐边常用
setbase(b)设置整数的基数,即进制情况,b可为8、10、16常用
setw(w)设置输出域宽域w时,该设置仅影响下次的cout输出常用
setfill(c)当数据小于输出域宽时,用字符c填充空位(默认使用空格填充)常用
setprecision(n)设置浮点数的输出精度为n。在使用非fixed且非scientific格式时,n即为有效数字最多的位数,如果有效数字位数大于n,则小数部分四舍五入,或自动变为科学计数法输出,共保留n位有效数字。在使用fixed和scientific格式时,n为是小数点后面应保留的位数常用
setiosflags()在当前格式的基础上,追加格式常用
resetiosflags()在当前格式的基础上,删除格式常用
boolapha把true和false输出为字符串,默认情况下是1和0不常用
showbase强制输出整数的基数,八进制数前显示0,十六进制数前显示0x不常用
showpoint总是输出小数点不常用
showpos在非负数值前显示“+”不常用
uppercase字母用大写表示,十六进制数中使用A ~ E,前缀使用0X,科学计数法使用E不常用
internal数值的符号位在域宽内左对齐,其数值右对齐,中间由填充字符填充不常用

6.3.1 小练习

1、定义一个整数123456,并输出原始值、十六进制值、十六进制字母大写值、输出整数前添加三个空格、输出整数前添加三个s字符。

展开看结果
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
	int a = 123456;
	cout << a << endl;
	cout << hex << a << endl;
	cout << setiosflags(ios::uppercase) << a << endl;
	cout << setw(8) << a << endl;
	cout << setfill('s') << setw(8) << a << endl;
	return 0;
}

2、定义两个变量,一个为十六十进制数,另一个为十进制数。利用cout输出第一个变量的十进制、十六进制形式,第二个变量的小写十六进制和大写十六进制形式。

展开看结果
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
	int i = 0x2f;
	int j = 255;
	cout << i << endl;
	cout << hex << i << endl;
	cout << hex << j << endl;
	cout << setiosflags(ios::uppercase) << j << endl;
	return 0;
}

3、定义一个整型变量并赋值,定义一个双精度变量并赋值,利用cout输出这两个不同精度的格式。

展开看结果
cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
	int x = 123;
	double y = -3.1415;
	cout << "x = ";
	cout.width(10);			// 设置输出域宽为10
	cout << x << endl;;			// 输出x
	cout << "y = ";
	cout.width(10);			// 设置输出域宽为10
	cout << y << endl;		// 输出y

	cout.setf(ios::left);	// 设置字符居左对齐
	cout << "x = ";
	cout.width(10);
	cout << x << endl;;
	cout << "y = ";
	cout << y << endl;

	cout.fill('*');			// 设置使用*填充
	cout.precision(4);		// 设置精度为4
	cout.setf(ios::showpos);// 设置正数前显示“+”
	cout << "x = ";
	cout.width(10);
	cout << x << endl;
	cout << "y = ";
	cout.width(10);
	cout << y << endl;

	return 0;
}

3、定义两个单精度类型,用cout输出不同长度的小数。

展开看结果
cpp
#include<iostream>
using namespace std;
int main() {
	float x = 20;
	float y = -400;

	cout << x << ' ' << y << endl;
	cout.setf(ios::showpoint);		// 强制显示小数点和尾数0
	cout << x << ' ' << y << endl;
	cout.unsetf(ios::showpoint);	// 去除强显示小数点和尾数0的格式
	cout.setf(ios::scientific);	  // 以科学计数法形式输出
	cout << x << ' ' << y << endl;

	return 0;
}

2.0 printf函数输出 C++中保留了C语言的输出函数printf(),使用它可以将任意数量、类型的数据输出到屏幕中,函数声明为printf("[控制格式]...[控制格式]", 数值列表);

其中“数值列表”为待输出的数值,可以是多个数值,每个数值之间使用逗号分隔。“控制格式”表示数值输出的格式,其数量与待输出的数值一致,并且一一对应。

%[*][域宽][长度]类型

其中“*”代表可以使用占位符;“域宽”表示输出长度,如果输出内容没有域宽长,用占位符占位,如果比域宽长,按实际内容输出,以适应域宽;“长度”决定输出内容的长度。例如,%d表示以整型格式输出数据,%c表示以字符格式输出数据。

常见的格式输出类型以及输出方式:

输出类型格式输出方式
d以十进制形式输出带符号整数(正数不输出符号)
1.%d:按整型数据的实际长度输出。
2.%*md:输出域宽为m。若输出数据小于m位,用“*”号指定的字符占位(如果未指定,使用空格占位);若大于m,则按实际输出
3.%ld:输出长整型数据。
o以八进制形式输出无符号整数(不输出前缀o),有一下几种格式
1.%o:按整型数据的实际长度输出。
2.%*mo:输出域宽为m。若输出数据小于m位,用“*”指定的字符占位(如果未指定,用空格占位);若大于m位,按实际位数输出。
3.%lo:输出长整型数据
x以十六进制形式输出无符号整数(不输出前缀ox)
1.%x:按整型的实际长度输出。
2.%mx:输出域宽为m。若输出数据小于m位,用“*”指定的字符占位(如果未指定,用空格占位);若大于m位,按实际位数输出。
3.%lx:输出长整型数据。
u以十进制形式输出无符号整数。
c输出单个字符。
s输出字符串
1.%s:按字符串的实际长度输出。
2.%*ms:输出位宽为m。若字符串长度大于m,将字符串全部输出;若字符串长度小于m,则字符串居右输出,左补“*”指定的字符(如果未指定,则左补空格)。
3.%-ms:输出域宽为m。若字符串长度小于m,则字符串居左输出,右补空格。
4.%m.ns:取字符串左端n个字符输出,输出域宽为m。这n个字符居右输出,左补空格。
5.%-m.ns:输出长整型数据。取字符串左端n个字符输出,输出域宽为m。这个n个字符串居左输出,右补空格。
f以小数形式输出单、双精度浮点数。
1.%f:不指定输出域宽,整数部分全部输出,小数部分输出6位。
2.%m.nf:输出域宽为m,其中有n位小数。如果输出长度小于m,则左补空格。
3.-m.nf:输出域宽为m,其中有n位小数。如果输出数值的长度小于m,则右补空格。
e以指数形式输出单、双精度实数。
1.%e:不指定输出域宽和小数位数。
2.%m.ne:输出域宽为m,其中有n位小数。如果输出数值的长度小于m,则左补空格。
3.%-m.ne:输出域宽为m,其中有n位小数。如果输出的数值小于m,则右补空格。
g以%f,%e中较短的输出域宽,输出单、双精度浮点数。

小栗子: 1、使用printf()输出整型数,在格式控制时分别以空格和“0”为占位符。

详细信息
cpp
#include<iostream>
using namespace std;
int main() {
	printf("%4d\n", 1);			//%4d,输出域宽为4位,用空格做占位符
	printf("%04d\n", 1);		//%40d,输出域宽为4位,用0做占位符
	int a = 10;
	int b = 20;
	printf("a = %d,b = %d\n", a, b);		//%d,按实际长度输出,这里无空格,相当于连接两个数字
	return 0;
}

2、定义单精度浮点数和双精度浮点数,利用printf()函数输出,体会不同格式控制下的输出差异。

详细信息
cpp
#include<iostream>
using namespace std;
int main() {
	float x = 1234.123456789;
	double y = 1234.123456789;
	printf("%f\n%15.2f\n%-10.3f\n%f", x, x, x, y);
	return 0;
}

3、利用printf()函数和格式控制符%e,用科学计数法输出小数。

详细信息
cpp
#include<iostream>
using namespace std;
int main() {
	float x = 1234.123456789;
	float y = 1234.123456789;
	printf("%e\n15.2e\n%-10.3e\n%e", x, x, x, y);
	return 0;
}

4、定义字符型指针,保存字符串“helloworld”。

详细信息
cpp
#include<iostream>
using namespace std;
int main() {
	const char* str = "helloworld";
	printf("%s\n%10.5s\n%-10.2s\n%.3s", str, str, str, str);
	return 0;
}

警示

%x、%X、%#X的区别:%x表示输出字母小写形式,%X表示输出字母大写形式,#表示输出标准十六进制形式。建议添加“#”,否则当输出的十六进制整好没有字母时,会被误认为是一个十六进制数。

💬 欢迎评论!请确保您已登录 GitHub。