《2022年c语言知识点总结 .pdf》由会员分享,可在线阅读,更多相关《2022年c语言知识点总结 .pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C 语言知识点总结C 语言知识点总结. 1一、常量 . 2二、标识符 . 2三、变量 . 2四、表达式 . 3五、输入输出函数. 4六、C 语言的语句 . 5七、C 程序的基本结构. 5八、选择结构语句. 6?if(表达式 ) 语句 1 else 语句 2 . 6?条件运算符表达式 1? 表达式 2 : 表达式 3 . 6?switch 语句 . 6九、循环结构 . 7?for 循环语句 . 7?while 循环语句do while 循环语句 . 7十、数组 . 8十一、字符串函数 . 8十二、函数 . 9十三、指针 . 10 十四、宏定义 . 11 十五、结构体,共用体,枚举类型. 11 十
2、六、Turbo C的使用 . 13 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 14 页 - - - - - - - - - - 一、常量?数字常量i.普通数字 :1,35,2.7 ii.指数形式 :2.45e-2等价于 2.45*10-2注意 e 大小写皆可, e 前面的数字不能省,就算是 1 也不能省,后面的数字一定要是整数iii.长整型,单精度浮点型 :3235L,32.5F 分别表示 3235 是长整型数据,32.5是单精度浮点型左,若不写上L,F 则表示 3235 是整型, 32
3、.5 是双精度浮点型, L,F 大小写皆可?字符常量i.普通字符常量 :用单引号 把一个字符括起来,如 A , ii.转义字符常量 :一对单引号括起来并以“ ” 开头的字符序列,如 n (回车)、 123 (8 进制 123 对应的字符 ), x23 (16 进制 23 对应的字符 ) ?字符串常量用一对 双引号 把一个字符序列括起来,如“ABCef” , 系统存放字符串常量,每个字符分配一个字节,各字符所占字节紧邻,并且字符串末尾会给再开一个字节里面放一个 0 做为结束标志 。?符号常量定义格式#define 符号常量名符号常量值 ,如#define N 20则定义了符号常量 N, 其值为
4、20, 注意符号常量名和符号常量值之间是用空格隔开,而不是写上 =号,#define和符号常量名之间也有空格的。二、标识符?命名规则以数字,字母,下划线这三类字符组成,但只能以字母或下划线开头,而不能也数字开头,另外 不能将关键字做为标识符。32 个关键字表在P365附录 B ?变量名,函数名,符号常量名全都是标识符三、变量?变量的定义格式类型名 变量名; 如 int a;定义了一个整型常量a。变量名是由人类随便定义的,符合命名规则的前提下,爱写啥就写啥。所以什么 flag, cc, y1或者函数名 fun,find等全部是自定的用来做为名字而已,没有更特别的意义。?类型名精品资料 - - -
5、 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 14 页 - - - - - - - - - - int 整型, long 长整型:用于存放整数,只是数值范围不同float 单精度浮点型double 双精度浮点型:用于存放实数,数值范围,精度不同char 字符型:用于存放字符?变量赋值,初始化int a=3;定义的同时初始化a=6*9;定义后在程序中进行赋值?变量的值只有在赋值操作时才会被改变, 即将其放在等号左边时才会改变它的值,或自增自减操作 :a=5,a+,a-,像 a+3 并未改变 a的值,只是使用了a的
6、值而已 .?自增自减运算变量+,+变量,变量 -,-变量使变量的值自增 1 或自减 1 等价于 变量=变量+1 变量=变量-1 +,-放于变量前后效果的区别:当自增自减运算做为表达式的一部分时,+ ,- 放在变量前面是先自增自减再使用变量的值, 放在变量后面则是先使用变量的值,再自增自减 。如 x=3; printf( “ %d” ,+x);则相当于执行了 +x; printf( “ %d” ,x);这样的操作所以打印出 4 再如 x=3; printf(“ %d” ,x+);则相当于执行了 printf(“ %d” ,x); x+;这样的操作,则打印出 3,当然最后 x 的值还是 4。四、表
7、达式?运算符和运算对象一个运算符都有若干个运算对象, 如 + 必然要跟两个运算对象才能进行加法运算:3+5。 C 语言里称需要跟 n 个运算对象的运算符为n 元运算符。一元运算符有 :!, (类型名)二元运算符有 :+,-,*,/,%(求余), =,+=,-=,*=,/=,%=, , =, = =(等于), !=(不等于 ),&( 且) , |(或) 多元运算符有 : ,?运算符的优先级和结合性i.优先级 :同一个运算对象左右两边若同时有两个运算符,则这两个运算符优先级高的先进行运算。ii.结合性 :若同一个运算对象左右两边的两个运算符优先级相同,则根据结合性判断先进行哪个运算, 自左自右结合
8、性的先算左边的运算符,自右自左的先算右边的运算符。iii.各运算符的优先级和结合性见P365附录 C?强制类型转换格式: (类型名 ) 表达式 。将后跟的表达式的值的数据类型转换为与圆括号内的类型名一致的类型。注意类型名一定要用()括起来 。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 14 页 - - - - - - - - - - ?算术表达式i.算术运算符 :+,-,*,/,%(求余) ii.由算术运算符加上运算对象构成算术表达式 ,如 3+3*6-9/2 iii.值:跟我们小学时学的
9、一样,就是表达式的计算结果iv.整数除以整数结果取整数部分,故1/3 得到的值是 0 v.5%3 结果为 2,想想小学除法,求余得到的是余数不是商。?赋值表达式i.赋值运算符 :=,+=,-=,*=,/=,%= ii.赋值表达式 :变量 =表达式,如 x=3+6,x+=6-9,x+=x*=3+4 注意等号左边只能是变量iii.复合赋值运算符的运算 :以/=为例: x/=表达式 等价于 x=x/(表达式 ) iv.值:=号左边的变量最终的值?关系表达式i.关系运算符 : , =, = =(等于), !=(不等于 ) ii.由关系运算符加上运算对象构成关系表达式 ,如 3=4, 2=a iii.值
10、:满足相应运算符所指定的关系的值为1,否则为 0 ?逻辑表达式i.逻辑运算符 :&( 且) , |(或) , !(非) ii.由逻辑运算符加上运算对象构成逻辑表达式 ,如 3&4, x|!y iii.值:满足相应运算符所指定的关系的值为1,否则为 0 iv.进行 | 或 运算时,若 | 左边的表达式值为1,则不再对右边的表达式进行运算。v.进行 & 且 运算时,若 & 左边的表达式值为0,则不再对右边的表达式进行运算。?逗号表达式i.逗号运算符 : ,ii.用逗号将各种表达式连续起来构成逗号表达式 ,如 3+4,a=9,8*a iii.值:组成逗号表达式的各个表达式中的最后一个的值,如上例为8
11、*a ?题目: P71117 P81833 五、输入输出函数?scanf(“ 格式控制串 ” ,变量地址表列 ); 如 scanf(“ %d%c%d” ,&a,&ch,&b); scanf(“ %4f” ,&x); 注意:i.格式控制串可控制截取用户输入的前几个字符给变量,但不能控制输入几位小数给变量,如不能写成scanf(“ %4.2f” ,&x); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 14 页 - - - - - - - - - - ii.第二个参数给的是地址 ,即要么是 &+
12、变量名或数组元素名的形式,要么就是一个数组名或指针变量名,如int *p,a; p=&a; scanf(“ %d” ,p); iii.考试时注意看题目给你写好的scanf 的格式1.若其格式控制串内各格式符用“, ”隔开如scanf(“ %d,%c,%d” ,&a,&ch,&b); 那输入时也要用逗号隔开,如此例输入时应: 3,+,5 2.若是这种格式 scanf(“ %d %d” ,&a,&b); 则输入时应: 3 5; 3.若是这种格式 scanf(“ %d%c%d” ,&a,&ch,&b); 则输入时应 3+5,若写成 3 + 5 则 a=3,ch= (空格),b=任意值(自己上机运行看
13、看结果 )?printf( “ 格式控制串 ” ,输出项表列 ); 如 float x=7.5; printf( “ %8.2f” ,x);此处的意思是将 x 打印出来,且占 8 列,保留两位小数。自己上机运行看看效果。?常用格式符汇总:i.%d :输入输出整型数据, %ld :输入输出长整型数据ii.%c:输入输出字符型数据iii.%f :输出单(双)精度浮点型数据,输入单精度型数据。%lf :输入双精度型数据iv.%s:输入输出一个字符串,用printf 输出字符串时,输出项书写时可为字符串常量,或字符数组名。如printf(“ %s” ,” hello” );或 char str10=”
14、 hello” ; printf(“ %s” ,str); v.%u :输入输出无符号整型, %o:输入输出八进制数,%x: 输入输出十六进制数?getchar(); 函数调用后返回用户输入的一个字符,故需再定义一个变量来存放这个字符,即使用时应char c; c=getchar() ;意思就是接收用户输入的一个字符,并将其赋值给变量c。?putchar( 字符常量或字符变量名);如 char c= A ; putchar(c);或 putchar( A );都会向屏幕输出字符A。六、C 语言的语句?表达式语句 :由表达式末尾加上分号构成。?函数调用语句 :由函数调用表达式加上分号构成。?空语
15、句 : ;?选择结构语句 :if 语句 switch 语句?循环语句 :for 语句 while 语句 do while 语句?复合语句 :用花括号将以上任意语句括起来构成一条复合语句。七、C 程序的基本结构void main() 声明部分 :用来定义变量和声明自定义函数的原型,需以“; ”结尾,如 int x; 执行语句部分 :第六点里介绍的各种语句,如x=3;printf( “ %d” ,x); main 函数外可写自定义函数。如精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 14 页 -
16、 - - - - - - - - - int max() return 0; 八、选择结构语句?if(表达式 ) 语句 1 else 语句 2 如果 if 语句的圆括号内的表达式值为非0,则执行语句 1,值为 0 则执行语句 2。i.表达式可为任意表达式 ,if 语句执行的实质是判断表达式的值是否为0来决定执行语句 1 还是语句 2。另外请在此处表达严重关切,不管是高手还是菜鸟经常会把判断两个数相等的符号“= ” 写成了一个等号“= ”成为了赋值运算, 这样的写法不会引发编译错误, 但结果会与原意大大不同,所以考试前请再三提醒自己。ii.语句 1 和语句 2 都只能是一个语句 ,若要跟多条语句
17、,切记用一对括起来,构成复合语句;也不要随便在圆括号后加“;” ,因“ ; ”构成一条空语句,这会使后面跟的语句1 不再属于 if 语句的组成部分 。iii.if 语句的三种结构1.单边: if(表达式 ) 语句2.双边:if(表达式 ) 语句 1 else 语句 2 3.多层(重点掌握 ):if(表达式 1) 语句 1 else if(表达式 2) 语句 2 else if(表达式 3) 语句 3 else 语句 n ?条件运算符表达式 1? 表达式 2 : 表达式 3 若表达式 1 的值非 0,则取表达式 2 的值做为整个表达式的值,否则取表达式 3 的值为整个表达式的值。如34? 1:2
18、 该表达式的值为 2 ?switch 语句switch(表达式 ) case 表达式 1:语句case 表达式 2:语句case 表达式 n:语句default: 语句精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 14 页 - - - - - - - - - - 语句执行过程:先计算表达式的值,然后判断该值与表达式1 到表达式 n 中的哪个相等,若与表达式i 的值相等,则执行表达式i 后的所有语句, 当遇到 break;语句时结束整个switch 语句的执行 。表达式 1 到表达式 n 的值
19、都不相等的情况下执行default 后跟的语句。每个 case后可跟多条语句。九、循环结构?for 循环语句for(表达式 1;表达式 2;表达式 3) 循环体语句语句执行过程:1.计算表达式 1 2.判断表达式 2 的值是否为 0,若为 0,语句执行结束,若不为0,进入步骤 3 3.执行循环体语句 (需注意的是循环体语句只能有一个语句,若要包含多个语句要用一对 括起来,构成一条复合语句,此处也不要随便加上“ ; ” ,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于 for 循环语句的部分 ) 。进入步骤 4 4.计算表达式 3,然后重新进入步骤2 ?while 循环语句do
20、 while 循环语句i.while(表达式 ) 循环体语句执行过程:1.判断表达式的值是否为非0,若是进入步骤 2,否则结束语句执行。2.执行循环体语句,重新回到步骤1。ii.do 循环体语句while( 表达式 );执行过程:1.执行循环体语句,进入步骤2 2.判断表达式的值是否为非0,若是重新回到步骤1,否则结束语句执行。这里要注意的地方跟for 语句一样, 即循环体语句只能有一个语句,若要包含多个语句要用一对 括起来,构成一条复合语句,此处也不要随便加上“ ; ” ,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于 while循环语句的部分,另外do while循环的
21、while( 表达式 )后是要加“; ”的。?break 语句:放在循环体内实现的功能是结束其所在的那层循环的执行。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 14 页 - - - - - - - - - - 十、数组?定义格式 :数据类型数组名 整型常量 ;如 int a10; 定义了一个整型数组,数组名为 a,这个数组含有10个元素。?引用数组元素 : 格式:数组名 下标切记下标值从 0 开始 。下标可为常量,表达式,变量等,如int i=3; a0=5;a3*2=9; ai=7;?初
22、始化 :数据类型数组名 整型常量 =数据表列 ;将数据表列的各个值依次赋值给数组的各个元素。如int a5=0,1,2,3,4 ;则数组 a各元素 a0到a4的值分别为 0,1,2,3,4 ?遍历数组元素数组定义后,我们 不能对数组进行整体的操作,如 int a10;不能用 a=3这样的操作将数组的各元素都赋值为3;而只能一个一个元素的进行赋值,如a0=3;a1=3;a2=3 a9=3; 当然此时我们就可以借助于一个for 循环来控制下标的变化从而对数组的各个元素进行赋值for(i=0;i y ? x : y ; return ( z ) ; 注意点:1.函数类型是指返回值的类型, 即要与 r
23、eturn语句后跟的表达式的值的类型一致。若函数类型为 void则说明该函数无返回值, 即函数体里不能出现return 语句。2.形式参数列表里定义的变量要记得给它们指定类型,而且如果同时要定义多个,应在每个前面都分别指定类型名,而不能写成 int x,y; 3.函数体里能写的语句跟main 函数一样,在开头可定义所需要的变量,后面跟上一堆执行语句。?函数调用流程以上面的函数为例,在main 函数进行调用:void main() int a,b,c; scanf(“%d%d ”,&a,&b); printf(“%d ”,max(a,b);或 c=max(a,b);printf(“%d ”,c)
24、 以上两种方法都会在屏幕中打印出a,b 间的较大值。调用函数的格式函数名 (实际参数列表 );调用的时候像什么函数类型,形式参精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 14 页 - - - - - - - - - - 数的类型就不要加上去了。 max(a,b) 中 max就是函数名, 写上变量名 a,b 是实际参数列表,执行这个调用语句时, 会先把 a,b 的值给相应位置的形式参数即执行了 x=a,y=b 这样的操作,然后开始执行 max函数的函数体的语句。 当 max函数体里执行到一个
25、 return语句时,则 max函数结束执行, 将 return后的表达式的值返回给 main函数调用 max函数的那个位置,即若上面 a=3,b=5 则 max(a,b)return后的表达式的值应该是5 也就是说执行完 max后把 5返回到调用 max的位置可看成 printf(“%d ”,5);或另一种解法的c=5。 十三、指针?指针变量的声明 : 类型名 * 指针变量名;?通过指针变量访问它所指向的普通变量的值先将普通变量的地址赋值给指针变量,再通过指针运算符* 得到普通变量的值。int *p,x,y; x=3; p=&x; 则 printf(“ %d” ,*p);会打印出 3 即 x
26、 的值y=*p;则 y 的值变为 3 *p=5;则 x 的值变为 5 ?指针变量加上(减去)一个位移的效果若指针变量存入的是数组元素的地址,则其加一减一得到的是那个数组元素下一个或前一个元素的地址。int a10; p=&a3; *p 得到的是 a3的值。若 p+;此时 p 存放的是 a4的地址 &a4; *p 得到的就是 a4的值。或 p-;此时 p 存放的是 a2的地址 &a2 ,*p 得到的就是 a2的值。?行指针i.主要是对于二维数组来说的, 二维数组每行都有自己的地址, 第 0 行地址用 数组名 表示,第 i 行地址为数组名 +i;而想要得到二维数组里一个元素的地址, 必需先得到其所
27、在行的地址, 然后再由那个地址得到元素的地址,比如说int a34;定义了一个二维数组,该二维数组第 0 行的地址为 a,第 1 行的地址为 a+1,第 2 行的地址为 a+2,想从行的地址得到元素的地址,需在行地址前加上指针运算符“*” ,即*a就是第 0 行首个元素的地址即a00 的地址,而 a02 的地址就是在a00的地址基础上加上位移量2,即*a+2,然后想得到 a02 这个元素的值呢就再加上一个指针运算符“*” ,即*(*a+2) ,类似地,想得到a22这个元素的值呢就是 *(*(a+2)+2) ii.定义行指针变量:类型名(*变量名) 数组长度 ;如 int (*p)4,a34;
28、p=a; 此时就可把 p 当成 a 来用,用法同上所述。?判断是否合法访问数组元素:若是指针法访问,判断指针后跟的是否地址;若是下标法访问,判断下标有无越界。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 14 页 - - - - - - - - - - ?函数指针:函数名即为函数的地址(指针)i.函数指针变量的定义:类型名(*变量名 ) (形参列表 );如 int (*p)();ii.赋值:指针变量 =函数名; 设有个函数其函数名为max,则要将该函数的地址给 p 的话只要执行如下语句即可
29、p = max;?指针数组: 指针数组的数组元素都是指针变量,是用来存放变量的地址的,定义格式为类型名 * 变量名 数组长度 ; 如 int * p10; ?指向指针的指针: 指针变量也是一种变量, 故在内存中也有对应的一个地址,而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量,定义格式类型名 * 变量名; 如 int *p1; int *p2; int a=3; 可进行赋值p1=&a; p2=&p1; 则 a 、*p1 和 *p2 的值都是 3.十四、宏定义?无参宏定义#define 标识符值定义后,出现所定义的标识符的地方都将以定义时指定的值来代替。#define M 2
30、+3 main() int x; x=M*M; 则 x 的值为 2+3*2+3=11 若想得到的结果是 (2+3)*(2+3) 则定义时也写成这样#define M (2+3) 注意#define、标识符、值之间都要用空格隔开,且宏定义结尾不需加分号。?带参宏定义#define 标识符 (参数表 ) 值#define S(x,y) x*y main( ) int a=3,b=4,c=5,d=6; printf(a*b=%dn, S(a,b); 此时会打印出a*b=12 printf(a+b*c+d=%dn , S(a+b,c+d); 此时会打印出 a+b*c+d=29,带参宏定义执行时是将a+
31、b这样一个表达式代替x, c+d这样一个表达式代替 y, 所以 S(a+b,c+d)进行的是 a+b*c+d 的运算,而不是将 a+b的值给 x,c+d的值给 y 然后再做 x*y ,这点跟函数调用传递参数是不一样的。?自定义类型名 typedef:对已存在的类型名取一个外号。i.基本格式: typedef 原类型名新类型名 ; ii.typedef int INTEGER; 则 int a,b;等价于 INTEGER a,b; iii.typedef int NUM10; 则 int a10;等价于 NUM a; a 即为一个有 10个元素的数组的数组名。iv.typedef int * I
32、NTEGER; 则 int *a,*b; 等价于 INTEGER a,b; 十五、结构体,共用体,枚举类型?结构体精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 14 页 - - - - - - - - - - i.结构体类型的定义及变量的定义struct 结构体名类型 成员 1;类型 成员 2;类型 成员 n;变量名 ; 如struct student long num; char name10; int score4; st1;定义类型时同时定义变量struct student st2;
33、 定义类型后,用类型名定义变量还有一种struct long num; char name10; int score4; st3;不给类型名,直接定义变量ii.结构体变量所占字节数 :各成员各占字节数之和 ,如以上 st1,st2,st3的字节数皆为 10+20+2*4=38 iii.结构体变量初始化: struct student a=20030001, 张三, 70,75,80,85; iv.结构体数组定义及初始化:struct student a3=20030001,zhang,89,90,91,92, 20030002,liu,68,69,70,71, 20030003,li,57,5
34、8,59,60 ; v.结构体变量成员的访问1.结构体变量名 . 成员名 如 st1.num 2.使用结构体类型的指针:(*结构体指针名 ) . 成员或结构体指针名 成员名struct student *st; st=&st1; st-num 或(*st).num ?共用体i.共用体类型的定义及变量的定义union 共用体名 类型成员名 1;类型成员名 n;变量的定义与结构体类似,也有三种方法。union data int i; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 12 页,共 14 页 -
35、- - - - - - - - - char ch; float f; d1; 定义类型时同时定义变量union data d2; 定义类型后,用类型名定义变量union int i; char ch; float f; d3; 不给类型名,直接定义变量ii.共用体变量所占字节数 :各成员所占字节数的最大值,如上 d1,d2,d3 所占字节数皆为 4.(单精度浮点型变量所占字节数最多为4). iii.共用体变量成员的访问1.共用体变量名 . 成员名 如 d1.i 2.使用共用体类型的指针:(*共用体指针名 ) . 成员或共用体指针名 成员名union data *dd; dd=&d1; dd-
36、i 或(*dd).i iv.共用体成员的值: 由于共用体各成员共用同一段内存区,故同一时刻只有一个成员的值是正确的。 如 d1.i=5;d1.ch= a ;则此时 d1.i 的值就不是 5 了,而是其他值了, d1.ch 的值是 a?枚举类型i.枚举类型的定义:enum 枚举名 枚举元素名 1,枚举元素名 2,枚举元素名 n;ii.枚举元素的值:默认值分别为 0、1、n-1 。枚举元素的值也可在定义时重指定,对于没有指定值的元素,按顺序加1如 enum weekdaysun=7,mon=1,tue,wend,thur,fri,sat; 则 sun值为 7,mon值为 1,tue 值为 2,we
37、nd 值为 3,thur 值为 4,fri 值为 5,sat值为 6 十六、Turbo C的使用?菜单激活 : F10?菜单切换 :左右方向键 在不同菜单间切换, 上下方向键 在同一个菜单不同选项间切换。?载入文件 :两种方法 :1.找到源文件所在位置,直接将其拉到Turbo C 快捷方式上; 2. F3 ?运行程序 : ctrl+F9?看程序运行结果 :alt+F5?进入编辑状态 :菜单 Edit?保存: F2?插入状态切换 : Insert 键精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 13 页,共 14 页 - - - - - - - - - - 文档编码:KDHSIBDSUFVBSUDHSIDHSIBF-SDSD587FCDCVDCJUH 欢迎下载 精美文档欢迎下载 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 14 页,共 14 页 - - - - - - - - - -