目录标题
1 字符集
字符集是构成C++的基本元素。用C++语言编写程序时,除字符型数据外,其他成分只能由字符集的字符构成。
- 英文字母:A ~ Z,a ~ z
- 数字字符:0 ~ 9
- 特殊字符:! # % ^ & * _ + = - ~ / \ ’ " ; . , : ? < > ( ) [ ] { } |
2 词法记号
词法记号是最小的词法单元,可分为关键字、标识符、文字、运算符、分隔符和空白符。
2-1 关键字
关键字是C++语言中预先规定的词汇,它们在程序中有特定的含义。
C++语言中包含的关键字有:
- alignas、alignof、asm、auto
- bool、break
- case、catch、char、char16_t、char32_t、class、const、constexpr、const_cast、continue
- decltype、default、delete
- do、double、dynamic_cast
- else、enum、explicit、export、extern
- false、float、for、friend
- goto
- if、inline、int
- long
- mutable
- namespace、new、noexcept、nullptr
- operator
- private、protected、public
- register、reinterpret_cast、return
- short、signed、sizeof、static、static_cast、struct、switch
- template、this、thread_local、throw、true、try、typedef、typeid、typename
- union、unsigned、using
- virtual、void、volatile
- wchar_t、while
2-2 标识符
标识符是程序员定义的单词,它命名程序正文中的一些实体,如函数名、变量名、类名、对象名等。
C++语言标识符的构成规则如下:
- 以大写字母、小写字母或下划线( _ )开始。
- 可以由大写字母、小写字母、下划线( _ )或数字0~9组成。
- 大写字母和小写字母代表不同的标识符。
- 不能是C++语言关键字或操作符。
注意:override、final标识符在特定上下文中有特殊含义,将被用作语法标志而并非普通标识符。
2-3 文字
文字是在程序中直接使用符号表示的数据,包括数字、字符、字符串和布尔文字。
2-4 操作符(运算符)
操作符是用于实现各种运算的符号,例如:+、-、*、/等。
C++语言还提供一些操作符的替代名:
and、andeq、bitand、bitor、compl、not、not_eq、or、or_eq、xor、xor_eq
2-5 分隔符
分隔符用于分隔各个词法记号或程序正文。
C++语言中的分隔符有:
() | {} | , | : | ; |
---|
2-6 空白
在程序编译时的词法分析阶段将程序正文分解为词法记号和空白。空白是空格、制表符、垂直制表符、换行符、回国符和注释的总称。
空白符用于指示词法记号的开始和结束位置,多余的空白将被忽略。
例如:
int i;
int i;
int
i
;
上图三个写法是等价的。但在书写程序时仍要力求清晰。
3 基本数据类型和表达式
3-1 基本数据类型
C++语言的基本数据类型有bool(布尔型)、char(字符型)、int(整型)、float(浮点型)、double(双精度浮点型)。加关键字signed、unsigned、short、long修饰后可分为下图:
类型名 | 长度/B |
---|---|
bool | 1 |
char | 1 |
signed char | 1 |
unsigned char | 1 |
short(signed short) | 2 |
unsigned short | 2 |
int(signed int) | 4 |
unsigned int | 4 |
long(signed long) | 4 |
unsigned long | 4 |
long long | 8 |
unsigned long | 8 |
float | 4 |
double | 8 |
long double | 8 |
其中,用short,long修饰int时,int可以省略。
注意:不同编译器对不同类型的长度会有不同定义。
3-2 常量
1. 整型常量
整型常量即以文字形式出现的整数,包括正整数、负整数和零。
整型常量有三种表示形式:十进制、八进制和十六进制。
- 十进制:若干个0 ~ 9的数字,但不能以0开头
- 八进制:0+若干个0 ~ 7的数字
- 十六进制:0x+若干个0 ~ 9的数字及A ~ F的字母(大小写均可)
2. 实型常量
实型常量即以文字形式出现的实数。
实型常量有两种表示形式:一般形式和指数形式。
- 一般形式:例如12.4,-12,4等
- 指数形式:例如0.345E+2表示 0.345 × 1 0 2 0.345\times10^2 0.345×102,-34.4E-3表示 − 34.4 × 1 0 − 3 -34.4\times10^{-3} −34.4×10−3。其中字母E大小写均可。
实型常量默认为double型,加后缀f(或F)可以使其成为float型,例如:12.3f。
3. 字符常量
字符常量是单引号括起来的一个字符,如:‘a’、'D’等
另外有一些字符是不可显示字符,也无法通过键盘输入,如响铃、换行、制表符、回车等。C++语言提供一种称为转义序列的表示方法来表示这些字符。
字符常量形式 | ASCII码(十六进制) | 含义 |
---|---|---|
\a | 07 | 响铃 |
\n | 0A | 换行 |
\t | 09 | 水平制表符 |
\v | 0B | 垂直制表符 |
\b | 08 | 退格 |
\r | 0D | 回车 |
\f | 0C | 换页 |
\ | 5C | 字符"" |
" | 22 | 双引号 |
’ | 27 | 单引号 |
? | 3F | 问号 |
无论是不可显示字符还是一般字符,都可以用十六进制或八进制ASCII码来表示,表示形式是:
- \nnn 八进制形式
- \xnnn 十六进制形式
其中nnn表示 3位八进制或十六进制数。例如,‘a’的十六进制ASCII码是61,所以’a’也可以表示为’\x61’。
4. 字符串常量
字符串常量简称字符串,是用一对双引号括起来的字符序列,例如:“abcd”、“China”。
字符串内可以使用转义字符,如:"Please enter “Yse” or “No”"表示Please enter “Yes” or "No"这一段文字。
通过添加前缀可以改变字符常量或者字符串常量的类型,前缀及其含义如下 :
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode16字符 | char16_t |
U | Unicode32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8 | char |
5. 布尔常量
布尔常量只有两个:false(假)和true(真)。
3-3 变量
1. 变量的声明和定义
变量在使用之前需要首先声明其类型和名称。
变量声明语句的形式:数据类型说明符 变量名1,变量名2,…,变量名n;
声明并不一定引起内存的分配,而定义一个变量意味着给变量分配内存空间,在C++程序中,大多数情况下变量声明就是变量定义,只有声明外部变量时例外。
2. 变量的初始化
在定义一个变量的同时,也可以给它设置初始值,称为对变量初始化。
例如:int a=3;
用于初始化变量的值可以是任意的表达式,在同一条定义语句中可以用先定义的变量值去初始化后定义的其他变量。
例如:double pi=3.14,c=10*pi;
3. 变量的存储类型
变量的存储类型决定了其存储方式。
- register存储类型:存放在通用寄存器中。
- extern存储类型:在所有函数和程序段中都可引用。
- static存储类型:在内存中是以固定地址存放的,在整个程序运行期间都有效。
- thread_local存储类型:具有线性存储生存期。只有用来修饰命名空间以及块作用域中的变量或者已经被指定为static存储类型的变量。
- mutable存储类型:只能用于类数据成员,并且不能与const或者static同时使用,也不能用来修饰引用变量。mutable修饰的类数据成员会使其const属性无效并允许更改mutable类型的类数据成员,但对象中的其余成员仍是const类型的。
3-4 符号常量
符号常量在使用之前一定要首先声明。
常量声明语句的形式为:const 数据类型说明符 常量名=常量值;
注意:符号常量在声明时一定要初始化,在程序中间不能改变其值。
3-5 运算符
优先级 | 运算符 | 结合性 |
---|---|---|
1 | [],(),.,->,后置++,后置– | 左 → \to →右 |
2 | 前置++,前置–,sizeof,&,*,+(正号),-(负号),~,! | 右 → \to →左 |
3 | (强制转换类型) | 右 → \to →左 |
4 | .,-> | 左 → \to →右 |
5 | *,/,% | 左 → \to →右 |
6 | +,- | 左 → \to →右 |
7 | <<,>> | 左 → \to →右 |
8 | <,>,<=,>= | 左 → \to →右 |
9 | ==,!= | 左 → \to →右 |
10 | & | 左 → \to →右 |
11 | ^ | 左 → \to →右 |
12 | ∣ \vert ∣ | 左 → \to →右 |
13 | && | 左 → \to →右 |
14 | ∣ ∣ \vert \vert ∣∣ | 左 → \to →右 |
15 | ?: | 右 → \to →左 |
16 | =,*=,/=,%=,+=,-=,<<=,>>=,&=,^=, | 右 → \to →左 |
17 | , | 左 → \to →右 |
3-6 数据类型转换
1. 隐含转换
将低类型数据转换为高类型数据。(安全的)
类型越高,数据表示范围越大,精度也越高。
各种类型的高低顺序如下:
- char(unsigned) 最低
- short(unsigned)
- int(unsigned)
- long(unsigned)
- long long
- float
- double 最高
也可将高类型数据转换为低类型数据,但有一定规则。
2. 显式转换
显式转换语法形式有两种:
- 类型说明符(表达式)//C++风格
- (类型说明符)表达式//C语言风格
除外还有四种类型转换操作符:
- const_cast<类型说明符>(表达式)
- dynamic_cast<类型说明符>(表达式)
- reinterpret_cast<类型说明符>(表达式)
- static_cast<类型说明符>(表达式)
4 数据输入与输出
输出格式:cout<<表达式<<表达式…
输入格式:cin>>表达式>>表达式…
格式控制:
需包含"iomanip"头文件
操纵符名 | 含义 |
---|---|
dec | 数值数据采用十进制表示 |
hex | 数值数据采用十六进制表示 |
oct | 数值数据采用八进制表示 |
ws | 提取空白符 |
endl | 插入换行符,并刷新流 |
ends | 插入空字符 |
setprecison(int) | 设置浮点数的小数位数(包括小数点) |
setw(int) | 设置域宽 |
5 基本控制结构
5-1 选择结构
if (表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
...
else 语句n
switch (表达式)
{
case 常量表达式1:语句1
case 常量表达式2:语句2
...
case 常量表达式n:语句n
default:语句n+1
}
5-2 循环结构
while (表达式) 语句
do 语句
while(表达式);
for (初始语句;表达式1;表达式2)
语句
或者
for (声明:表达式)
语句
5-3 其他控制语句
break;
出现在switch语句或循环体中,使程序从中跳出。
continue;
出现在循环体中,作用是结束本次循环,接着开始判断决定是否继续执行下一次循环。
语句标号:语句
goto 语句标号;
使程序跳转到语句标号所指定的语句。
6 类型别名
C++语言提供两种方法用于定义类型别名:
typedef 已有类型名 新类型名表;
using 新类型名=已有类型名;
第一种方式可以一次性为一个已有数据类型声明多个别名,例如:
typedef double Area,Volume;
Area a;
Volume v;
using Area=double;
using Volume=double;