1
第一章:预处理指令
使用预处理器是编程的一部分,可以将相应的头文件引入文件,
使用其中的函数、类型定义以及预处理宏,下面逐一介绍:
一、include指令——文件包含
说明:该指令可以将程序所需的头文件引入程序源文件,是比较
常用的指令;
格式:
(一)系统头文件:#include
(二)个人头文件:#include"头文件"
注:C语言的对应头文件是“stdio.h”
二、define指令——宏
说明:该指令可以为程序的某个部分提供可以替换的符号。
格式:
(一)带参数的宏:
#define(参数1,参数2,......,参数n)替换域
注意:
(1)替换域中的参数要带括号;
(2)替换域中要参数替换的部分用参数名替换;
(二)不带参数的宏
#define替换域
三、if指令——条件
2
说明:用于执行条件编译,当条件成立时则执行语句。
格式:
#if条件
语句
#endif
四、ifdef指令——检查宏是否已定义
说明:如果宏已定义,则执行语句。
格式:
#ifdef宏
语句
#endif
五、ifndef指令——检查宏是否未定义
如果宏未定义,则执行语句。
格式:
#ifndef宏
语句
#endif
六、else指令——选择
说明:在if失败时执行语句,属于if块。
格式:
#else
语句
3
七、elif指令
说明:等价于elseif语句,当表达式为True时执行语句,属
于if块。
格式:
#elif表达式
语句
八、undef指令
说明:取消宏定义
格式:#undef已定义的宏
九、line指令
说明:改变_LINE_和_FILE_的内容,主要用于调试或其他特殊应
用。
格式:#linenumber["filename"]
十、error指令
说明:该指令主要用于调试,它强迫编译器编译终止,并通过预
处理器发出一条错误信息
格式:#error"文本"
十一、endef指令
说明:结束条件编译
十二、pragma指令
说明:向编译程序传送命令
参数:
4
(一)Message参数
说明:向编译输出口传送文本信息
格式:
#pragmamessage("文本")
(二)code_seg参数
说明:它能够设置程序函数代码存放的代码段,当我们开发驱动
程序时就要用到它。
格式:
#pragmacode_seg(["section-name"["section-class"]])
(三)once参数
说明:只要在头文件里加入这条指令,就可以确保头文件只编译
一次,这条指令实际上在VC6就已经有了,但考虑到兼容性并没有太
多使用它。
格式:#pragmaonce
(四)hdrstop参数
说明:表示预编译头文件到此为止。
格式:#pragmahdrstop
(五)resource参数
说明:将*.dfm文件中的资源加入该工程;
格式:#pragmaresource"*.dfm"
(六)comment参数
说明:该指令将一个注释记录放入一个对象文件或可执行文件
5
中,常用的lib关键字,可以帮我们连入一个库文件。
格式:#pragmacomment(...)
(七)warning参数
说明:警告参数;
格式:#pragmawarning(格式参数1:错误号,格式参数2:错
误号,...,格式参数n:错误号)
格式参数:
(1)disable:不显示
(2)Once:只显示一次
(3)Error:把警告信息作为一条错误信息
此外,warning还支持以下格式:
(1)#pragmawarning(Push,n)
注意:N代表警告的等级(1-4)。
说明:保存所有警告信息的警告状态,并把警告级别设定为n。
(2)#pragmawarning(POP)
说明:从栈中弹出一个警告信息,在入栈和出栈之间的一切改动
取消。
(3)#pragmawarning(Push)
说明:保存所有警告信息的警告状态。
(八)pack参数
说明:指定结构体的对齐方式,该指令来设定变量以n字节对齐
方式。
6
注意:
(1)如果n大于该变量所占用的字节数,那么偏移量以满足默认
的对齐方式;
(2)如果n小于该变量所占用的字节数,偏移量为n的倍数,不
用满足默认的对齐方式;
(3)结构体:如果n大于所有成员类型的所占用的字节数,那么,
结构体的总大小必须为占用空间量大的变量占用空间的空间数的倍
数,否则为n的倍数。
支持以下格式:
(1)#pragmapack(push)
说明:保存对齐方式。
(2)#pragmapack(pop)
说明:恢复对齐方式。
第二章:基本数据类型
C语言提供了多种基本类型,他们如下表所示:
类型 说明
int 整型
float 单精度浮点型
double 双精度浮点型
char 字符串
提供了以下变量修饰符:
?Const:
7
?首先需要注意的是,const修饰的是在它前面的类型,如果它前
面没有类型,那它修饰的是紧跟着它的那个类型
?用于参数列表,通常修饰的是指针类型,表明该函数不会试图对
传入的地址进行写操作。
?作用:限定一个变量不允许被改变。
?Static:
?当static用于修饰全局变量声明时,它表示该变量具有文件作用
域,只能被该源文件的代码引用,不能被其他源文件中的代码访
问
?当static用于修饰局部变量声明时,它表示该变量不是分配在该
函数的活动记录中,而是分配在全局的数据段(或bss段)中。简
单的说,就是被static修饰的局部变量实际上并不是局部变量,
而是具有函数作用域的全局变量,除了只能在定义它的函数内访
问外(这是由C语法决定的),它的运行时特征和全局变量完全一
样,函数返回不会影响它的状态,它的初始化仅有一次,发生在
程序的装载时,而不是在每次函数调用的时候初始化。
?Volatile:告诉优化器不能优化这个变量的读写操作,一定要为这
个变量的读写操作生成代码。
?Auto:函数初始和局部类型的默认存储类型,在函数调用时被分配
到栈上,在函数返回时释放存储空间。
?Extern:置于变量或者函数前,以表示变量或者函数的定义在别的
文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定
8
义。另外,extern也可用来进行链接指定。
?Register:暗示编译程序相应的变量将被频繁地使用,如果可能的
话,应将其保存在CPU的寄存器中,以加快其存储速度(请求编译
器将其存放在CPU寄存器中)。
(一)基本变量声明:
语法:
类型名变量表;
(二)数组声明:
语法:
类型名变量1[大小],变量2[大小],...,变量n[大小];
(三)指针声明:
语法:
类型名*变量1,*变量2,...,*变量n;
注意:
(1)赋值时,诺带有*(间接访问运算符),则只能赋给变量的内容,
否则只能赋给地址;
(2)赋内容之前必须先赋予可访问的地址;
(四)指针数组
语法:
类型名*变量1[大小],*变量2[大小],...,*变量n[大小];
注意:
(1)赋值时,诺带有*(间接访问运算符),则只能赋给变量的内容,
9
否则只能赋给地址;
(2)赋内容之前必须先赋予可访问的地址;
(五)数组下标
语法:
数组名[任意表达式];
第三章:扩展数据类型
扩展数据类型可由用户定义,分为结构类型(struct)、牧举类
型(enum)以及联合类型(union)。
注意:诺不加typedef关键字,这只能定义变量和标签。
(一)牧举类型定义:
语法:
Typedefenum[标签]
{
用户标识符表
}类型名;
(二)结构类型定义
语法:
Typedefstruct[标签]
{
类型名1变量1;
类型名2变量2;
...
10
类型名n变量n;
}类型名;
(三)联合类型定义
说明:编译器只为联合类型中最大的成员变量分配空间,一
个成员变量改变,其他成员变量同时改变;
语法:
Typedefunion[标签]
{
类型名1变量1;
类型名2变量2;
...
类型名n变量n;
}类型名;
第四章:函数
一、主函数
主函数是程序的入口,所有的C语言程序都有一个主函数,C语
言的主函数为main函数,区分大小写。
(一)无参程序
语法:
Intmain(void)
{
函数体;
11
}
(二)带程序参数的程序
语法:
Intmain(intargn,char*argc[])
{
函数体;
}
注意:
? Argn:程序向量,用户传递给程序的参数数量(包括程序名);
? Argc:程序参数,用户传递给程序的参数(包括程序名)
二、函数声明
语法:
类型名函数名(形参表);
形参表声明:
类型名变量;
注意:不同形参用逗号分割;
第五章:表达式
一、赋值表达式
语法:
变量=表达式;
二、算术表达式
语法:
12
操作数1(算术运算符)操作数2;
三、逻辑表达式
语法:操作数1(逻辑运算符)操作数2;
四、强制类型转换
语法:(转换类型)变量;
五、逗号表达式
语法:操作数1,操作数2,...,操作数n;
六、条件表达式
语法:条件:True?False
说明:当条件为True时,执行True,否则执行False。
七、初始化表达式
语法:类型名变量1=操作数1,变量2=操作数2,...,变量n=操
作数n;
八、复合赋值运算表达式
语法:变量(运算符)=表达式;
说明:等效于变量=变量(运算符)表达式;
第六章:语句结构
一、顺序结构
说明:程序顺序执行的结构
二、选择结构
(一)if语句
(1)if-else语句
13
语法:
If(逻辑表达式1)
{
程序块1;
}
Else
{
程序块2;
}
(2)if语句
语法:
If(逻辑表达式)
{
程序块;
}
(3)else-if语句
语法:
If(逻辑表达式1)
{
程序块1;
}
Elseif(逻辑表达式2)
14
{
语句块2;
}
Elseif(逻辑表达式3)
{
语句块3;
}
...
Else
{
程序块n;
}
(二)switch语句
语法:
Switch(表达式)
{
Case常量表达式1:语句1;
Case常量表达式2:语句2;
Case常量表达式3:语句3;
...
Case常量表达式n-1:语句n-1;
Default:语句n;
15
}
Switch语句的控制流是从符合条件的标号进入,从最后一条
语句出来;
三、循环结构
(一)while语句
语法
While(逻辑表达式)
{
语句块;
}
(二)do-while语句
语法:
Do
{
语句块;
}
While(逻辑表达式);
(三)for语句
语法:
For(初始化表达式;逻辑表达式;更新表达式)
{
语句块;
16
}
四、跳转结构
(一)goto语句--无条件转移指令
语法:goto标号;
(二)break语句--跳出循环、switch
语法:break;
(三)return语句--返回语句
语法:return(返回值);
(四)continue语句--跳出一次循环
语法:continue;
五、空语句“;”
注:
(1)“;”是C、C++语言的语句结束符,语句后面必须加“;”;
(2){、}为程序块定义,后不需要加语句结束符。
第七章:数据结构
数据结构分为动态数据结构和静态数据结构
一、链表
链表属于动态数据结构,实质上是一个带有指向下一个节点的指针的
结构类型的指针;
运算符:
间接成员访问运算符(->)为链表运算符;
二、有序表
17
有序表实指从头到尾都按一定顺序(升序或降序)排列的数据结构,
用链式结构表示是为动态数据结构。
三、队列
队列是一种先进先出结构,用链式结构表示是为动态数据结构,并且
之后一个结构的指针域指向队头。
四、栈
栈是一种后进先出结构,用链式结构表示是为动态数据结构。
附录1:C语言运算符及优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明
1 [] 数组下标 数组名[常量表达式] 左到右
() 圆括号 (表达式)/函数名(形
参表)
. 成员选择(对象) 对象.成员名
-> 成员选择(指针) 对象指针->成员名
2 - 负号运算符 -表达式 右到左 单目运算符
(类型) 强制类型转换 (数据类型)表达式
++ 自增运算符 ++变量名/变量名++ 单目运算符
-- 自减运算符 --变量名/变量名-- 单目运算符
* 取值运算符 *指针变量 单目运算符
& 取地址运算符 &变量名 单目运算符
! 逻辑非运算符 !表达式 单目运算符
~ 按位取反运算符 ~表达式 单目运算符
sizeof 长度运算符 sizeof(表达式)
3 / 除 表达式/表达式 左到右 双目运算符
18
* 乘 表达式*表达式 双目运算符
% 余数(取模) 整型表达式/整型表达
式
双目运算符
4 + 加 表达式+表达式 左到右 双目运算符
- 减 表达式-表达式 双目运算符
5 << 左移 变量<
>> 右移 变量>>表达式 双目运算符
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式 双目运算符
< 小于 表达式
<= 小于等于 表达式<=表达式 双目运算符
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!= 表达式 双目运算符
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1?表达式2:
表达式3
右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左
/= 除后赋值 变量/=表达式
*= 乘后赋值 变量*=表达式
%= 取模后赋值 变量%=表达式
+= 加后赋值 变量+=表达式
19
-= 减后赋值 变量-=表达式
<<= 左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&= 按位与后赋值 变量&=表达式
^= 按位异或后赋值 变量^=表达式
|= 按位或后赋值 变量|=表达式
15 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺
序运算
附录2:ANSIC定义的C语言32个关键字
关键字 意义
auto 声明自动变量
short 声明短整型变量或函数
int 声明整型变量或函数
long 声明长整型变量或函数
float 声明浮点型变量或函数
double 声明双精度变量或函数
char 声明字符型变量或函数
struct 声明结构体变量或函数
union 声明共用数据类型
enum 声明枚举类型
typedef 用以给数据类型取别名
const 声明只读变量
unsigned 声明无符号类型变量或函数
20
signed 声明有符号类型变量或函数
extern 声明变量是在其他文件中声明
register 声明寄存器变量
status 声明静态变量
volatile: 说明变量在程序执行中可被隐含地改变
void 声明函数无返回值或无参数,声明无类型指针
if 条件语句
else 条件语句否定分支(与if连用
switch 用于开关语句
case 开关语句分支
for 一种循环语句
do 循环语句的循环体
while 循环语句的循环条件
goto 无条件跳转语句
continue 结束当前循环,开始下一轮循环
break 跳出当前循环
default 开关语句中的“其他”分支
sizeof 计算数据类型长度
return 子程序返回语句(可以带参数,也可不带参数)