《C语言基础培训》PPT课件.ppt_第1页
《C语言基础培训》PPT课件.ppt_第2页
《C语言基础培训》PPT课件.ppt_第3页
《C语言基础培训》PPT课件.ppt_第4页
《C语言基础培训》PPT课件.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,C语言培训 (第一讲),上海*通信技术有限公司 金刚() 2011-03,2,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,3,C语言概述,C语言是70年代初问世的。1978年由美国电话公司B.W.Kernighan和D.M.Ritchit合著了著名的”THE C PROGRAMMING LANGUAGE”一书。通常简称为,也有人称之为标准。 但是,在中并没有定义一个完整的标准C语言,后来由美国国家标准协会(American National Standards Institute)在此基础上制定了一个C语言标准,于1983年发表。称之为ANSI C.,4,C语言概述,C语言是国际上广泛使用的,且很有发展前途的计算机高级语言,时下流行的C+语言和C#语言都是从C语言发展而来的。 C语言适合用来进行系统描述,即可用来编写系统软件,也可用来编写应用软件。 C语言是一种与UNIX密切相关的程序设计语言,它最初用于DECPDP-11计算机UNIX。 20世纪70年代以来,操作系统中的大部分内容和应用程序都是用C语言编写的。,5,C语言优点,语言简洁、紧凑(32个关键字),使用方便、自由。 auto break case char const continue default do double else enum extern float for goto if int long register return short signed static sizeof struct switch typedef union unsigned void volatile while,6,C语言优点,运算符丰富,共有34种,C语言把括号、赋值、强制类型转换等都作为运算符处理。表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言上难以实现的运算。 数据结构合理,具有现在语言的丰富数据结构,能用来实现各种复杂的数据结构(如链表、树、栈等)的运算。 具有结构化的控制语句,是结构化的理想语言 允许位操作和对硬件进行编程。 生成目标代码质量高,程序执行效率高 程序可移植性较好,7,简单的C程序介绍,vi test.c #include void main() printf (“Hello World!”); 保存后退出 在操作系统下使用gcc命令编译源程序,如下所示: gcc -o test test.c 运行目标程序: ./test 输入结果如下所示: Hello World! main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,且只 能有一个主函数main。 include称为文件包含命令,扩展名为.h的文件称为头文件。,8,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,9,数据类型,一个程序应包括数据的描述和动作的描述两方面的内容。著名计算机科学家沃思曾提出一个公式:程序=数据结构+算法,可见数据结构在程序中的地位。 C语言为用户提供了丰富的数据结构,还允许用户自定义复杂的数据结构。C语言提供的数据结构是以数据类型的形式出现的,C的数据类型划分如下图所示:,实型(浮点型),10,数据类型,常量与变量 C语言中数据有常量与变量之分。 常量一般能从字面形式判别,也可用一个标识符代表,可用下面的形式声明: #define 常量名 常量值 例如: #define PI 3.14 /* 定义PI代表常量3.14 */ “/*” 和“*/”之间表示这行符号中为注释内容,不会被编译。 变量可用下面的形式声明: 数据类型 变量名; 如: int i; char name; 在C语言中,习惯上用大写字母代表常量,用小写字母代表变量。对于变量,要求“先定义,后使用”。,11,数据类型,2.整型数据 1)整型常量 整型常量可分为:int、short int、long int和unsigned int、unsigned short、 unsigned long等类型,他们表示的数的范围不同。 2)整型变量 整型变量可分为基本型、短整型、长整型3种,下面给出一个示例: main() int a,b,c; unsigned d; a=6;b=-7;u=78; c=a+b+u; printf(“%dn”,c); /*printf为格式化输出函数 */ /* %d表示输出格式化为十进制的整数*/ 运行结果为: 77,12,数据类型,2.实型数据 1)实型常量 实型常量有两种表示方式, 一种为十进制形式,如0.12、36.2; 另一种为指数形式,如123e3表示123000。要注意e字母之前必须要有数字,e字母后面必须为整数。 2) 实型变量 实型变量分为单精度(float)和双精度(double)两种,如: float x; double y; 单精度实数在内存中占4个字节,而双精度实数在内存中占8个字节。,13,数据类型,4. 字符型 1) 字符常量 C语言字符常量是用单引号括起来的一个字符,如a、A等,注意 以上两个字符是不同的。 另外,C语言还允许以一个“”开头的特殊字符常量,具体规定如表所示:,看以下下来代码的输出结果: main() printf(“ ab ct dertgn”); printf(“htibjd”); ,14,数据类型,4. 字符型 2) 字符变量 用来存放字符变量,且只能放一个字符,定义规则如下: char d ; /*表示d为字符型变量*/ 3) 字符数据在内存中的存储形式和使用方式 字符变量在对应的内存中存放的是该字符相应的ASCII码,例如字符a的ASCII码为97,b的ASCII代码为98,而字符与整型变量还可以互相赋值。 示例代码: main() char c1,c2; c1=97,c2=98; printf(“%c %c”,c1,c2); /*%c表示输出格式为字符类型*/ 输出结果是: a b 4) 字符串常量 字符串常量与字符常量的区别在于前者是双引号括起来的字符序列,而后者是 单引号括起来的单个字符。如在内存中a的长度是一个字符,而“a”则占有两个字 符,后者包括 结束标志“0”,15,数据类型,5.枚举型 所谓枚举,是指将变量的值一一列举出来,变量的值只限于 列举出来的值。 可用如下定义形式: enum weekday sun,mon,tue,wed,thu,fri,sat; 它定义了一个名为weekday的枚举类型,能取7个值 然后,我们可以用此类型来定义变量,如: enum weekday date; 则date被定义成枚举变量,它能取sun到sat这7个值之一,如: date=sun; 也可直接定义枚举变量,如: enum weekday sun,mon,tue,wed,thu,fri,sat date; /*效果与上相同*/ 在C编译中,对枚举元素按常量处理,且它们是有值的。在上面的定义中, sun的值为0,sat的值为6.,16,数据类型,代码示例: main() enum sun,mon,tue,wed,thu,fri,sat date; date=mon; printf(“%d”,date); 输出结果是:1 说明: 枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为 任何基本类型。 在编译中,对枚举元素按常量处理,故称枚举常量,它们不是变量,不能对 它们赋值。 枚举元素作为常量,它们是有值的,c语言编译按定义时的顺序使它们的值 为0,1,2, 枚举值可以用来做判断比较 一个整数不能直接赋给一个枚举变量。,17,数据类型,5.布尔型 C语言将非零整数都认为是真,认为零是假。布尔型只有真、假两个值。在 表达式中,布尔量也作为整数处理,整数也可出现在布尔表达式中。 示例代码: main() int m=1,j=6; while(m) /*m不等于0,为真*/ j=j+m; m=m-1; printf(“%d”,j); 则输出结果是: 7,18,数据类型,7.数组 数组是有序数据的集合,数组中每一元素都属于同一数据类 型,用一个统一的数组名和下标来唯一的确定数组中的元素。 1)一维数组 一维数组的定义格式如下: 类型说明符 数组名常量表达式; 如: int a10; 数组名为a,且有10个元素,下标从0到9,即a0到a9 注意常量表达式不能是变量,19,数据类型,7.数组 一维数组的引用:只能逐个引用数组元素而不能引用整个数组 数组名下标; 代码示例如下: main() int j,a10; for(j=0;j=0;j-) printf(“%d”,aj); 运行结果是: 9876543210,20,数据类型,7.数组 一维数组的初始化列举如下: static int a10=0,1,2,3,4,5,6,7,8,9; /*static是静态数据的意思*/ 则 a0=0 a1=1 a9=9 如果花括号中值的个数少于10,则后面的都为0 2)字符数组 字符数组是一类特殊的数组,数组的每一个元素存放一个字母。 下面是它的定义方式: char 数组名常量表达式; 如: static char c5=a,e,t,g,b; 3).二维数组元素的引用和初始化 数组类型 数组名常量表达式1常量表达式2=初始化数据;,21,数据类型,8.指针 指针是C语言中的一个重要特色,可以说是C语言的精华。 它的概念非常复杂,使用非常灵活,是C语言中最大的难点。 一个变量在内存中的地址就称为该变量的指针。我们通过地 址就能找到所需的变量单元。 指针变量的定义用下面的形式: 类型标识符 *标识符; 例如: int *pointer_1; 定义了一个指针变量pointer_1,它指向整型变量。 如果还定义了一个整型变量i,则可用赋值语句使一个指针变量 指向一个整型变量。如: pointer_1=,22,数据类型,8.指针 1. f(int *a,int n) ,23,数据类型,8.指针 二维数组是“数组的数组”,例如: 定义int a34=1,3,5,7,9.11.13,15,17,19,21,23,则二维数组a是由3个 一维数组所组成的。设二维数组的首行的首地址为2000,则有:,24,数据类型,8.指针 指向多维数组的指针变量: 把二维数组a分解为一维数组a0,a1,a2之后,设p为指向 二维数组的指针变量,可定义为:int (*p)4 它表示p是一个指针变量,它指向包含4个元素的一维数组。 若指向第一个一维数据a0,其值等于a,a0,或&a00 而p+i则指向一维数组ai 从前面的分析可得出*(p+i)+j是二维数组i行j列的元素的地 址,而*(*(p+i)+j)是i行j列元素的值 二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量)长度 其中类型说明符为所指数组的数据类型。*表示其后的变量 是指针类型。长度表示二维数组分解为多个一维数组时,一维数 组的长度,也就是二维数组的列数。,25,数据类型,8.指针 指针函数是返回指针的函数。 例如:int * getInt(char * str); 函数指针是指向函数地址的指针。 例如: int (*func)(char a,char b); 指针数组:一个数组,若其元素均为指针类型数据,称为指 针数组,也就是说,指针数组中的每一个元素都相当于一个指针 变量。一维指针数组的定义形式为:类型名 数组名数组长度; 例如:int *name4; char *name=“this”,”is”,”a”,”dog”; 指向指针的指针: 例如:char *p; p的前面有两个*号。*运算符的结合性是从右到左,因此*p相当于 *(*p),显然*p是指针变量的定义形式。如果没有最前面的*号,那就是定 义了一个指向字符串数据的指针变量。现在它的前面又有了一个*,表示 指针变量p是指向一个字符指针变量的。 *p就是p所指向的另一个指针变量,26,数据类型,一、指针变量加减一个整数 如:p+,p-,p+i,p-i, 二、指针变量赋值 将一个变量地址赋给一个指针变量,如: p= /p1和p2都是指针变量,将p2的值赋给p1,27,数据类型,三、指针变量可以为空值,即该指针变量不指向任何变量,可 以这样表示:p=NULL; 四、两个指针变量可以相减 如果两个指针变量都指向同一个数组中的元素,则两个指 针变量值之差是两个指针之间的元素个数。,28,数据类型,五、两个指针变量比较 若两个指针指向同一个数组的元素,则可以进行比较。指 向前面的元素的指针变量“小于”指向后面元素的指针变量 关于void类型: void真正发挥作用在于: 1.对函数返回的限定 2.对函数参数的限定 例如:void abc(void); void指针和const指针: ANSI新标准增加了一种“void”指针类型,即不指定它是指 向哪一种类型数据的指针变量。例如:void * p; 表示指针变量p不指向一个确定的类型数据,它的作用仅 仅是用来存放一个地址。 void指针它可以指向任何类型数据。也就是说,可以用任 何类型的指针直接给void指针赋值。但是,如果需要将指针的 值赋给其它类型的指针,则需要进行强制类型转换。,29,数据类型,void main(void) const char *str=“hello world”; /在指针定义语句的类型前加const,表示指向的对象是常量 /声名一个名为str的指针变量 /它指向一个字符型常量,初始化str为指向字符串/hello world str0=w; /这条语句是错误的,但可以改变str指针的值 printf(“nn%s”,str); str=“hello ,china”; printf(“nn%s”,str); void main(void) char * const str=“hello world”;/在指针定义语句的指针名前加const,表示指针本身是常量 /常量指针是一个固定的指针,不可以改变它的值,但它所指的数据可以改变 printf(“nn%s”,str); str0=w; /合法 str=“hello ,china”;/非法 printf(“nn%s”,str); const char * const str=“hello world”;,30,数据类型,9.结构体 结构体是C语言提供的一种数据结构,相当于其他高级语言 中的“记录”。 下面是定义一个结构体类型的一般形式: struct 结构体名 成员列表 变量名列表; 对个成员都进行类型说明,如: 类型标识符 成员名,31,数据类型,9.结构体 下面是一个具体示例: struct student int num; char name20; char sex; int age; float score; char addr(30); student1=“33”,”zhanwei”,”m”,”22”,”75”,”32#307”); 定义了一个struct student类型的变量student1,它包括 num,name,sex,age,score,addr不同类型的数据项,各项初值分别为 33、zhanwei、m、22、75、32#307,32,数据类型,10.共用体 几个不同的变量共占同一段内存的结构,称为“共用体” 共用体类型变量的定义形式如下: union 共用体名 成员列表 变量列表; 如: union data int j; char ch; float f; a,b,c; 上面定义了一个union data类型,再将a,b,c定义为union data 类型 共用体的引用方式如下: a.j 上语句引用共用体变量a中的整型变量j,33,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,34,运算符和表达式,1.运算符 C语言提供了十分丰富的运算符,主要有如下几种: 算术运算符:+、-、*、/、+等 关系运算符:、等 赋值运算符:等号(=)及其扩展赋值运算符(+=、-=、*=、/=等) 指针运算符:*、& 2.表达式 用各种运算符将运算对象连接起来的式子,就称为表达式。,35,运算符和表达式,1)算术表达式 用算术运算符和括号将运算对象连接起来的式子,称为算术 表达式。包括强制类型转换,可将一个表达式转换成所需类型。 如将x+y的值转换成整型: (int)(x+y); 这里请注意两个特殊的算术运算符:+和-,分别为“自增” 和“自减”运算符。 i+ 先使用自身的i值,再自身加i +i; 先加i,再使用新的i变量。 2)赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为 “赋值表达式”。一般形式为: 如: a=87;,36,各类数值型数据之间的混合运算,变量的数据类型是可以转换的,转换的方法有两种,一种是自动转 换,一种是强制转换。自动转换发生在不同数据类型的混合运算时,由 编译系统自动完成。 自动换换遵循以下规则: 1)若参与运算变量的类型不同,则先转换成同一类型,然后进行计算 2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long运算时,先把int量转换成long型再进行计算。 3)所有的浮点运算都是以双精度运行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。 4)char型和short型参与运算时,必须先转换成int类型。 5)在赋值运算中,赋值号两边变量的数据类型不同时,赋值号右边的类型将转换为左边的类型。如果右边量的数据类型长度比左边长时,将丢失一部份数据,这样会降低精度,丢失的部分按四舍五入向前舍入。 下图表示了类型自动转换的规则:,37,强制类型转换,强制类型转换时通过类型转换运算来实现的。 其一般形式为:(类型说明符)(表达式) 其功能是把表达式的运算结果强制转换成类 型说明符所表示的类型。 例如: (float) a /把a转换成实型 (int) (x+y) /把x+y的结果转换成整型,38,逗号运算符和逗号表达式,在C语言中逗号”,”,也是一种运算符,称为逗号运算符。其 功能是把两个表达式连接起来组成一个表达式。 其一般形式为:表达式1,表达式2, 其求值过程是分别求两个表达式的值,并以表达式2的值作 为整个逗号表达式的值。 对于逗号表达式要说明: 逗号表达式一般形式中的表达式1和表达式2页可以又是 逗号表达式 例如:表达式1,(表达式2,表达式3),形成嵌套表达式 因此可以把逗号表达式扩展为以下形式:表达式1,表达式 2,表达式n 整个逗号表达式的值等于表达式n的值,39,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,40,C程序语句,C语言的语句用来向计算机系统发出操作指令。一个语句经 编译后产生若干条机器指令。C语言程序的结构如下图所示:,41,C程序语句,C程序语句主要可以分为如下三类: 1.控制语句 完成一般的控制功能,主要有如下几种: 1)条件语句(if) 根据判断所给条件是否满足来决定执行何种操作,有三种形式的if语句 .if (表达式) 语句; 如果表达式成立,执行语句 . if (表达式) 语句1; else 语句2 如果表达式成立,执行语句1,否则执行语句2 . if (表达式1) 语句1; elseif (表达式2) 语句2; elseif (表达式n) 语句n; else 语句m;,42,C程序语句,代码示例如下: /*判断所输入的年份是否为闰年*/ main() int year,leap; scanf(“%df”, 如果输入: 2000 计算机将输出: 2000 is a leap year,43,C程序语句,2.循环语句 while循环语句 while(表达式) 语句; 当表达式为真时,执行语句命令。如果循环体包含一个以上 的语句时,应该用大括号“”括起来。 do-while语句 do 语句; while(表达式); 与while语句表达式不同的是:while语句是先判断,后执行; 而此语句是先执行语句,后判断表达式。,44,C程序语句,2.循环语句 for循环语句 for(循环变量初值;循环条件;循环变量增值) 语句; 如循环体语句包含一个以上的语句,应用花括号括起来。 下面的程序实现输出100-200间的偶数 代码如下所示: main() int n; for(n=100;n=200;n+) if (n%2=0) printf(“%d”,n); ,45,C程序语句,3.多分之选择语句switch C语言提供switch语句直接处理多分之选择,它相当于Pascal 语言中case语句。下面是一般形式。 switch(表达式) case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式n:语句n;break; default:语句n+1; 执行过程为:当表达式的值与某一个case后面的常量表达式的 值相等时,就执行此cae后面的语句。各个case的常量表达式的值 必须互不相同,它们的出现次序不影响执行结果。,46,C程序语句,/*根据所输入的成绩判断所处的等级*/ main() int score,grade; printf(“please inut your score:”); scanf(“%d”, 如果你输入你的成绩: 76 计算机会算出: Do not play so more!,47,C程序语句,break和continue语句 break语句可以用来从循环体内跳出循环体,即提前结束循环,接着 执行循环下面的, 其语法形式为: break; break语句不能用于循环语句和switch语句之外的任何其他语句中。 注意: 1)break语句对if-else的条件语句不起作用。 2)在多层循环中,一个break语句只向外跳一层。 continue语句 作用为结束本次循环,即跳过循环体中下面尚未结束的语句,接着 进行下一次是否执行循环的判定。 一般形式为: continue;,48,C程序语句,2.函数调用语句 函数调用语句是由一个函数调用加一个分号构成的语句。 1).基本输入语句 字符输入语句(getchar) 作用是从终端或运输设备中输入一个字符,此函数没有参数 变量名=getchar(); 格式输入语句(scanf) 用scanf函数可以输入任何类型的多个数据。 scanf(格式控制,地址列表); 格式控制是用双引号括起来的字符串,也称为转换控制字符串, 主要用到的格式字符如下。 %d用来输入十进制整数 %ld用来输入长整型数据 %hd用来输入短整型数据 %c用来输入单个字符 %s用来输入字符串 %f用来输入实数 %lf用来输入double型实数,49,C程序语句,2.函数调用语句 示例代码如下: main(0 int a,b; scanf(“%d %d”, 运行按如下方式输入a和b的值: 3 4 (输入a,b的值) 3,4 (输出a,b的值),50,C程序语句,2)基本输出语句 字符输出函数putchar 作用是向终端输出一个字符。如: putchar( c ); 输出字符变量c的值 格式化输出函数printf 作用是向终端输出若干个任意类型的数据 printf(格式控制,输出列表); 格式控制与前面输入语句的规定几乎一样,但要增加以下几项: %u用来输出unsigned %m.nf用来指定输出的实数数据共占m列,其中有n位小数 %m.ne用来输出指数形式的实数,m为所占的列数,n指小数位 数。,51,C程序语句,下面的程序将实现华氏温度到摄氏温度的转换,c表示摄氏温度,f表示华氏温 度,输出小数点后两位,示例代码如下: #include /*include 属于编译预处理中的“文件包含”语句*/ main() float c,f; scanf(“%f”, 它与赋值表达式的区别是最后的分号,一个语句最后必须以分号结尾。C语言的大多数 语句都是表达式语句。,52,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,53,函数,概述: 一个较大的程序可分为若干个程序模块,每一个模块用来实 现一个特定的功能。 在高级语言中用子程序实现模块的功能。子程序由函数来完 成。一个C程序可由一个主函数和若干个其他函数构成。 函数的调用关系: 由主函数调用其他函数,其他函数也可以互相调用。同一个 函数可以被一个或多个函数调用任何多次。,54,函数,函数调用说明: 1)一个C程序由一个或多个程序模块组成,每一个程序模 块作为一个源程序文件。 对较大的程序,一般不希望把所有内容全放在一个文件中, 而是将他们分别放在若干个源文件中,再由若干源程序文件组成 一个C程序。这样便于分别编写、分别编译,提高调试效率。一 个源程序文件可以为多个C程序公用。 2)一个源程序文件由一个或多个函数组成。 一个源程序文件是一个编译单位,在程序编译时时以源程序 文件为单位进行编译的,而不是以函数为单位进行编译的。 3)所有函数都是平行的,即在定义函数时是分别进行的, 是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套 定义。 函数间可以互相调用,但不能调用main函数,因为main函 数是系统调用的。,55,函数,函数调用说明: 4)从用户使用的角度看,函数有两种: 标准函数,即库函数。这是由系统提供的,用户不必自己 定义这些函数,可以直接使用它们。应该说明,不同的C系统提 供的库函数的数量和功能会有一些不同,当然许多基本的函数是 共同的。 用户自己定义的函数,用以解决用户的专门需要。 6)从函数的形式看,函数分两类: 无参函数。 有参函数。,56,函数,一个较大程序一般应分为若干个程序模块,在高级语言中用 子程序来实现模块的功能。函数用如下方式定义: 类型标识符 函数名(形式参数列表) 形式参数说明 说明部分 语句 下例是一个求解两数之和的函数: int add(x,y) int x,y; int z; z=x+y; return (z); /*返回值为z*/ ,57,函数,可以在程序中调用已经定义了的函数,调用方式如下: 函数名(实参列表); 如对上面定义的函数,有下面的程序段: main() int add(); /*声明函数原型*/ int a,b,c; scanf(“%d,%d”, 如果输入: 54,32 则得到如下输出: The sum of a and b is 86,58,函数,有关形参与实参的一些重要说明: 1)在定义函数中指定的形参时,它们并不占内存中的存储 单元。只有在发生函数调用时,函数max中的形参才被分配内存 单元。在调用结束后,形参所占的内存单元也被释放。 2)实参可以是常量、变量或表达式,如: max(3,a+b); 但要求它们有确定的值。在调用时将实参的值赋给形参。 3)在被定义的函数中,必须指定形参的类型。 4)实参与形参的类型应相同或赋值兼容。如果实参为整型 而形参为实型,或者相反。 例如实参值a为3.5,而形参x为整型,则将实数3.5转换成整 数3,然后送到形参b.字符型与整型可以互相通用。,59,函数,5)在C语言中,实参向对形参的数据传递时“值传递”(相当于 COPY),单项传递,只由实参传给形参,而不能由形参传回来 给实参。在内存中,实参单元与形参单元式是不同的单元。 在调用函数时,给形参分配存储单元,并将实参对应的值传 递给形参,调用结束后,形参单元被释放,实参单元仍保留并维 持原值。因此,在执行一个被调用函数时,形参的值如果发生改 变,并不会改变主调函数的实参的值。,60,函数,关于函数的返回值的一些说明: 1)函数的返回值是通过函数中的return语句获得的: return语句将被调用函数中的一个确定值带回主调函数中去 如果需要从被调用函数带回一个函数值供主调函数使用,被调用函 数中必须包含return语句。 如果不需要从被调用函数带回函数值可以不要return语句。 一个函数中可以有一个以上的return语句,执行到哪一个return语句, 哪一个语句起作用,return语句后面的括弧也可以不要,如return z;等价 于return (z); return后边的值可以是一个表达式。 2)函数的返回值应当属于某一个确定的类型,在定义函数时指定 函数返回值的类型。 特别提示: 在C语言中,凡不加类型说明的函数,自动按整型处理。 3)对于不带返回值得函数,应当用”void”定义函数为”无类型”(或称 空类型”) 这样,系统就保证不使函数返回任何值,即禁止在调用函数中使用 被调用函数返回值。 此时在函数体中不得出现return语句。,61,函数,对被调用函数的声明和函数原型: 在一个函数中调用另一个函数(即被调用函数)需要具备哪些条件呢? 1)首先被调用的函数必须是已经存在的函数(是库函数或用户自定 义函数)。 2)如果使用库函数,还应该在本文件开头用#include命令将调用有关 库函数时所需用到的信息“包含”到本文件中来。 3)如果使用用户自定义的函数,而该函数的位置在调用它的函数 (即主调函数)的后面(在同一个文件中),应该在主调函数中为被调 函数作声明。 关键词区别以下: 声明一词的原文是declaration,过去在许多书中把它译为说明。声明的作 用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在 遇到函数时,编译系统能正确识别函数并检查调用是否合法。(例如函数 名是否正确,实参与形参的类型和个数是否一致)。 函数的定义和声明不是一回事。函数定义是指对函数功能的确立,包 括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的 、独立的函数单位(占内存),62,函数,函数的嵌套调用 嵌套定义就是在定义一个函数时,其函数体内又包含一个函 数的完整定义。 然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也 就是说,在调用一个函数的过程中,又调用另一个函数。 main() a(); a() b(); b() return 0; ,63,函数,局部变量和全局变量 局部变量:在一个函数内部定义的变量是内部变量,它只在 本函数范围内有效,也就是说只有在本函数内才能使用它们,在 此函数以外是不能使用这些变量的。这称为局部变量。 说明: 1)形式参数是局部变量。 2)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效。这种复合语句也称为分程序或程序块。 示例: void main() int a,b; int c; c=a+b; /c在此范围内有效,a,b在此范围内也有效 ,64,函数,全局变量: 在函数内定义的变量是局部变量,而在函数之外定义的变量 称为外部变量,外部变量是全局变量(也称为全程变量) 全局变量可以为本文件中的函数所共用。它的有效范围为从 定义变量的位置开始到本文件结束。,65,函数,全局变量: 全局变量在程序的全部执行过程中都占用存储单元,而不是 仅在需要时才开辟单元。 使用全局变量过多,会降低程序的清晰性,人们往往难以清 楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可 能改变外部变量的值,程序容易出错。因此,要限制使用全局变 量。 它使函数的通用性降低了,因为函数在执行时依赖于其所在 的外部变量。如果一个函数移到另一个文件中,还要将有关的外 部变量及其值一起移过去。但若该外部变量与其他文件的变量同 名时,就会出现问题,降低了程序的可靠性和通用性。 一般要求把C程序中的函数作成一个封闭体,除了可以通过 “实参-形参”的渠道与外界发生联系外,没有其他渠道。,66,函数,变量的存储类别: 动态存储方式与静态存储方式: 前面介绍了从变量的作用域(即从空间)角度平分,可以分为全局 变量和局部变量。 从变量值存在时间(即生存期)角度来分,又可以分为静态存储方 式和动态存储方式。 静态存储方式是指在程序运行期间在静态存储区分配存储空间的方式。 动态存储方式则是在程序运行期间根据需要在动态存储区分配存储 空间的方式。 用户存储空间可以分为三部分: 1.程序区 2.静态存储区 3.动态存储区 在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类 别。 对数据类型(如整型、字符型等)。存储类别指的是数据在内存中 存储的方式。 存储方式分为两类:静态存储和动态存储 具体包含四种:自动的(auto),静态的(static),寄存器的(register), 外部的(extern) 根据变量的存储类别,可以知道变量的作用域和生存期,67,函数,auto变量 函数中的局部变量,如不专门声明为static存储类别,都是 动态的分配存储空间的(栈),数据存储在动态存储区中。 函数中的形参和在函数中定义的变量(包括在复合语句中定 义的变量),都属此类,在调用该函数时系统会给它们分配存储 空间,在函数调用结束时就自动释放这些存储空间。 因此这类局部变量称为自动变量。自动变量用关键字auto作 存储类别的声明。 int f(int a) auto int b,c=3; 关键字auto可以省略,auto不写则隐含定为“自动存储类别”, 属于动态存储方式。,68,函数,用static声明局部变量: 有时希望函数中的局部变量的值在函数调用结束后不消失而 保留原值,即其占用的存储单元不释放,在下一次该函数调用时 ,该变量已有值,就是上一次函数调用结束时的值。 这时就应该指定该局部变量为静态局部变量,用关键字static 进行声明。 对静态局部变量的说明: 1.静态局部变量属于静态存储类别,在静态存储区内分配存 储单元。在程序整个运行期间都不释放。 2.对静态局部变量是在编译时赋初值的,即只赋值一次,在 程序运行时它已有初值。以后每次调用函数时不再重新赋初值, 而只是保留上次函数调用结束时的值。,69,函数,3.如在定义局部变量时不赋初值的话,则对静态局部变量来 说,编译时自动赋初值0(对数值型变量)或空字符串(对字符 变量) 4. 虽然静态局部变量在函数调用结束后仍然存在,但其他函 数是不能引用它的。,70,函数,register变量: 一般情况下,变量(包括静态存储方式和动态存储方式)的 值是存放在内存的。 当程序中用到哪一个变量的值时,由控制器发出指令将内存 中该变量的值送到运算器中。经过运算器进行运算,如果需要存 数,再从运算器将数据送到内存存放。,71,函数,register变量: 如果一些变量使用频繁(例如在一个函数中执行1000次循环, 每次循环中都要引用某局部变量),则为存储变量的值要花费不 少时间。 为提高执行效率,C语言允许将局部变量的值放在CPU中的 寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存 中去存取。 由于对寄存器的存储速度远高于对内存的存取速度,因此这 样做可以提高执行效率。 这种变量叫做寄存器变量,用关键字register作声明。 用extern声明外部变量: 外部变量即全局变量,它的作用域是从变量的定义处开始, 到本程序文件的末尾。 在此作用域内,全局变量可以为程序中各个函数所引用。编 译时将外部变量分配在静态存储区。 有时需要用extern来声明外部变量,以扩展外部变量的作用域,72,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,73,编译预处理,通常在C编译系统对程序进行编译前,先对程序中一些特殊的命令 进行“ 预处理”,然后将预处理的结果和源程序一起进行编译处理, 得到目标代码。 1.宏定义 1)不带参数的宏定义 用一个指定的标识(即名字)来代表一个字符串,它的一般形式如下: #define 标识符 字符串 如: #define PI 3.1415926 这里需要注意的有以下几点: 宏定义不是C语句,结尾不必加分号。若加上分号则连分号也一起 被置换。 通常#include 命令写在文件开头,位于函数之前,作为文件的一部 分,在此文件范围内起作用,其作用域为宏定义命令起到源程序结束。 如果要终止其作用域可使用#undef命令。 对程序中用双引号括起来的字符,即使与宏名相同,也不作替换 进行宏定义时,可以引用已定义的宏名,可以层层替换。 在编写源程序时,所有的3.1415926都可由PI代替,而对源程序做编 译时,将先由预处理程序进行宏代换,即用3.1415926表达式去置换所 有的宏名PI,然后再进行编译。,74,编译预处理,2)带参数的宏定义 除了进行简单的字符串替换外,还要进行参数替换,它的一般形式 如下: #define 宏名(参数表) 字符串 带参数的宏与函数非常类似,在引用函数时也是在函数名后的括号 内写实参,且要求实参的数目等于形参的数目,但它们还是有区别的: 对参数的使用方式不一样。函数调用时,先求出实参表达式的值, 然后带入形参;宏只进行简单的字符替换。 处理机制不一样。函数调用在程序运行时处理,且要分配内存;宏 展开在编译时进行,不分配内存单元,不发生值的传递处理,也不存在 返回值 定义时的要求不一样。函数定义时,实参和形参都要定义类型;宏 定义时不存在类型问题。 在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。,75,编译预处理,2)带参数的宏定义 示例代码如下: /*输入一个圆的半径,求出它的面积*/ #include “stdio.h” #define PI 3.1415926 #define area PI*r*r main() float r,a; scanf(“%f”, 注意: 1.带参宏定义中,宏名和形参表之间不能有空格出现。 2.在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。,76,编译预处理,2.文件包含语句 在文件包含语句中,一个源文件可以将另外一个源文件的全 部内容包含起来,其一般形式如下: #include “文件名” 如: #include 此时被包含的文件stdio.h与其所在的文件在预编译之后组成 同一个文件。对被包含文件的修改将影响到其所在的文件。 说明: 1.一个include命令只能指定一个被包含文件,若有多个文件要包含,则 需用多个include命令 2.文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。 3.包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。,77,编译预处理,2.文件包含语句 例如:以下写法都是允许的: #include “stdio.h” #include 但是这两种形式是有区别的: 使用尖括号表示在包含文件目录中去查找(包含目录是由用 户在设置环境时设置的),而不在源文件目录去查找。 使用双引号则表示首先在当前的源文件目录中查找,若未找 到才到包含目录中去查找。用户编程时可根据自己的文件所在的 目录来选择某一种命令形式。,78,编译预处理,3.条件编译 预处理程序提供了条件编译的功能。可以按不同的条件去编译不同 的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试 是很有用的。 条件编译有三种潜规则,下面分别介绍: 第一种:形式: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的功能是,如果标识符已被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。 或者: #ifdef 标识符 程序段1 #endif,79,编译预处理,3.条件编译 第二种:形式: #ifndef 标识符 程序段1 #else 程序段2 #endif,80,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,81,Linux系统概述,Linux系统的基本知识和一些重要特性: Linux系统是从UNIX发展来的。 UNIX是世界上最流行的操作系统之一,它是一 种实时操作系统,是可以运行于大型和小型计算机上 的多任务系统。但由于它比较庞大,而且价格昂贵, 所以不适合PC机用户使用。而Linux正好弥补了这些 缺点,同时还继承了UNIX的大多数优点。 由于它是基于PC机上运行的操作系统,并且内核 源代码是公开的,使得Linux成为时下比较流行的操作 系统之一。,82,Linux系统的发展历史,Linux是一种适用基于PC机的计算机操作系统,它适合于多 种平台,是目前唯一免费的非商品化操作系统。 Linux诞生于1991年底,是一个芬兰大学生开发出来的。由 于具有结构清晰、功能强大等特点,它很快成为许多院校学生和 科研机构的研究人员学习和研究的对象。 在他们的热心努力下,Linux逐渐成为一个稳定可靠、功能 完善的操作系统。而一些软件公司也不失时机的推出以Linux 为核心的操作系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论