标记(token)是具有唯一含义的语言的最小单位,分为五种:关键字(keyword)、标识符(identifier)、常量(constant)、串字面量(string literal)以及标点符号(punctuator)。
关键字
关键字也称为保留字,C语言共有44个关键字:
auto | break | case | char | const |
---|---|---|---|---|
continue | default | do | double | else |
enum | extern | float | for | goto |
if | inline | int | long | register |
restrict | return | short | signed | sizeof |
static | struct | switch | typedef | union |
unsigned | void | volatile | while | _Alignas |
_Alignof | _Atomic | _Bool | _Complex | _Generic |
_Imaginary | _Noreturn | _Static_assert | _Thread_local |
标识符
标识符由小写字母、大写字母、数字、下划线、通用字符名或实现定义的字符构成,且数字不能作为标识符的第一个字符,关键字不能作为标识符。
C语言大小写敏感。
C语言对标识符的最大长度没有具体的限制,VC允许标识符的最大长度为247个字符。
通常,应该选择相应的英文单词或其缩写作为标识符,做到见名知义。
常量
在程序运行过程中,其值不变的量称为常量。常量分为四种类型。
整数常量
整数常量只包括正整数和零,不包括负整数。
整数常量分为十进制整数常量、八进制整数常量和十六进制整数常量。
十进制整数常量由 0~9 组成,且以非零数字开头,如 123 、 1000 。
八进制整数常量由 0~7 组成,且以 0 开头,或者只有一个0,如 017 、 0 。
十六进制整数常量由 09 、AF(或 a~f )组成,且以 0x 或 0X 开头,如0x1a 、 0XD5 。
1 |
|
浮点常量
计算机中的浮点数只能近似地表示值在某个范围之内的有理数和一些特殊值,如NAN(非数值)、+INF(正无穷大)、-INF(负无穷大)等。
浮点常量是非负的浮点数,其十进制书写形式有以下两种:
- 小数点表示法
由数字 0 ~9 和小数点组成,必须有小数点。如果小数点左边为0,则 0 可省略;如果小数点右边为 0 ,则 0 可省略。
例如: 5.20 520.0 520. 0.520 .520 0.0 0. .0
- 指数表示法
第一种形式:
1 十进制整数常量E符号位 十进制整数常量第二种形式:
1 浮点常量的小数表示法E符号位 十进制整数常量
其中,E 也可以写成 e , “符号位” 即正负号是可选的。
枚举常量
枚举常量是类型为 int 的标识符。
字符常量
字符常量分为整数字符常量和宽字符常量。
1 |
|
分析 ASCII 码表,可以得出四条规则:
(1)数字字符 0~9 的 ASCII 码值是连续递增的。
(2)大写字母 A~Z 的ASCII 码值是连续递增的。
(3)小写字母 a~z 的 ASCII 码值是连续递增的。
(4)大写字母的 ASCII 码比相应小写字母的 ASCII 码值小 32 。
转义序列 | 含义 | 十进制ASCII码值 |
---|---|---|
\a | 响铃(alert) | 7 |
\b | 退格(backspace) | 8 |
\f | 走纸换页(form feed) | 12 |
\n | 换行(new line),光标移到下一行的行首 | 10 |
\r | 回车(carriage rerurn),光标移到当前行的行首 | 13 |
\t | 水平制表(horizontal tab),光标移到当前行的下一个制表位 | 9 |
\v | 垂直制表(verical tab) | 11 |
串字面量
串字面量分为三种:字符串字面量、UTF-8串字面量 和 宽串字面量。
字符串字面量是用一对双引号括起来的零个或多个字符。在翻译的第七个阶段,空字符即’\0’被加到字符串字面量的末尾,然后字符串字面量以数组元素类型为 char 的数组的形式存储在内存中。
如果字符串字面中不含’\0’,则该字符串字面量也称为字符串。
字符串的长度是指空字符前的字符在内存中所占的字节数。因此,长度为 n 的字符串,在内存中占 n+1 个字节。
不要将字符常量与字符串相混淆。例如,’z’ 是字符常量,占 4 个字节;而 “z” 是字符串,占 2 个字节。
类型
类型分为两种:
对象类型(object type):用于描述对象
函数类型(function type):用于描述函数
基本类型
枚举类型
一组命名的整数常量值构成枚举(enumeration),不同的枚举构成不同的枚举类型。
空类型
空类型的值的集合是空集,空类型是不完整对象类型,而且不可能是完整的。
派生类型
变量与常用类型说明符
变量
常用类型说明符有四种,分别是 int 、char、float 和 double 。
变量必须先声明后使用。
常用类型
在 0 ~ 2147483647 范围内的整数常量,其类型是 int 。
char 类型在输入时,两个数字字符之间不能加空格符,如果加了空格符,char 类型的变量获取的是空格符,而不是数字字符。
双精度浮点类型 double 比单精度浮点类型 float 精度更高,表示数据的范围更大。
浮点常量默认是 double 类型,在浮点常量后加后缀 f 或 F 则是 float 类型。
在没有特殊要求的情况下,程序设计中声明浮点常量,建议使用 double 类型。
运算符与表达式
表达式
表达式是由运算符和运算对象构成的序列。
表达式具有以下一个或多个功能:
- 描述一个值的计算
- 指定一个对象或一个函数
- 产生副作用
根据运算符的运算对象的数量,可将运算符分为以下三种:
- 单目运算符:只有一个运算对象
- 双目运算符:有两个运算对象
- 三目运算符:有三个运算对象
乘法类运算符
乘法运算符 | 除法运算符 | 模运算符 |
---|---|---|
* | / | % |
乘法类运算符有三个,都是双目运算符。
加法类运算符
加法运算符 | 减法运算符 |
---|---|
+ | - |
加法类运算符有两个,都是双目运算符。
sizeof运算符
sizeof 运算符是单目运算符,表达式的值是运算对象所占用内存大小(按字节计算),其运算对象是表达式或用小括号括起来的类型名。
char 类型在内存中占 1 个字节。
int 类型在内存中占 4 个字节。
float 类型在内存中占 4 个字节。
double 类型在内存中占 8 个字节。
一元加运算符与一元减运算符
一元加运算符 + 是单目运算符,表达式的值是运算对象的值。
一元减运算符 - 是单目运算符,表达式的值是运算对象的相反数。
整数提权实例:
1 |
|
运行结果:
1 | sizeof +ch = 4 |
变量 ch 是 char 类型,在内存中占 1 个字节,整数提升将 ch 的值转换为 int 类型的值,因此,表达式 +ch 和 -ch 的类型都是 int ,在内存中占 4 个字节。
注意:变量 ch 的类型并没有改变,仍然是 char 类型。
常用算术转换
其中一个运算对象是 double 类型,另一个运算对象的值被转换为 double 类型的值。
如果以上条件不满足,并且其中一个运算对象是 float 类型,另一个运算对象的值被转换为 float 类型的值。
如果以上两个条件都不满足,对两个运算对象进行整数提升,即 char 类型运算对象的值被转换为 int 类型的值。
运算对象的类型并没有改变。