C语言程序设计课件第5章.ppt

上传人:wuy****n92 文档编号:70101273 上传时间:2023-01-16 格式:PPT 页数:56 大小:403KB
返回 下载 相关 举报
C语言程序设计课件第5章.ppt_第1页
第1页 / 共56页
C语言程序设计课件第5章.ppt_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《C语言程序设计课件第5章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第5章.ppt(56页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第5章 函数返回主目录返回主目录第5章 函数 本章主要介绍本章主要介绍C C语言程序函数的语言程序函数的基本知识和基本应用。基本知识和基本应用。1.1.函数与模块化程序设计函数与模块化程序设计2.2.函数的概述函数的概述3.3.函数的嵌套调用和递归调用函数的嵌套调用和递归调用4.4.变量的作用域和生存期变量的作用域和生存期5.5.编译预处理编译预处理第5章 函数一、函数与模块化程序设计一、函数与模块化程序设计1 1 模块化程序设计方法:模块化程序设计方法:程序员在设计一个比较复杂的应用程序时,一般采用的方程序员在设计一个比较复杂的应用程序时,一般采用的方法是将整个程序分解成若干个功能较为单一的

2、、相对独立的法是将整个程序分解成若干个功能较为单一的、相对独立的程序模块分别实现,然后再将所有的程序模块象搭积木一样程序模块分别实现,然后再将所有的程序模块象搭积木一样装配起来,形成一个完整的程序,这种在程序设计中分而治装配起来,形成一个完整的程序,这种在程序设计中分而治之的策略称为模块化程序设计方法。之的策略称为模块化程序设计方法。优点:主要体现在程序编制方便,易于修改和调试,可由优点:主要体现在程序编制方便,易于修改和调试,可由多人共同参与完成,缩短程序的设计时间,并能实现程序多人共同参与完成,缩短程序的设计时间,并能实现程序模块的标准化、规范化。模块的标准化、规范化。第5章 函数 在在C

3、语言中,函数是程序的基本组成单位,程序设计人员语言中,函数是程序的基本组成单位,程序设计人员可以很方便地用函数作为程序模块来实现程序的模块化,一个可以很方便地用函数作为程序模块来实现程序的模块化,一个函数就是一个模块,独立完成一项功能。函数就是一个模块,独立完成一项功能。第5章 函数采用普通的程序设计方法采用普通的程序设计方法#include stdio.h#include stdio.hmain()main()int a,b,max;int a,b,max;printf(printf(输入两个整数:输入两个整数:););scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b

4、);if(ab)if(ab)max=a;max=a;else max=b;else max=b;printf(max=%dn,max);printf(max=%dn,max);例例5-1 求两个整数的最大值。求两个整数的最大值。采用结构化程序设计方法采用结构化程序设计方法#include stdio.h#include stdio.hint fmax(int x,int y)int fmax(int x,int y)int z;int z;if(xy)z=x;if(xy)z=x;else z=y;else z=y;return z;return z;main()main()int a,b,ma

5、x;int a,b,max;printf(printf(输入两个整数:输入两个整数:););scanf(%d%d,&a,&b);scanf(%d%d,&a,&b);max=fmax(a,b);max=fmax(a,b);printf(max=%dn,max);printf(max=%dn,max);第5章 函数2 程序模块设计一般原则程序模块设计一般原则 模块相对独立模块相对独立 一个模块往往要求完成一个单独的功能,并与其他模一个模块往往要求完成一个单独的功能,并与其他模块尽量保持一定的独立性,当修改这个模块时,不会引起整块尽量保持一定的独立性,当修改这个模块时,不会引起整个程序的混乱。同时,

6、在模块内部,尽量将数据局部化,便个程序的混乱。同时,在模块内部,尽量将数据局部化,便于保证数据在不同模块之间的正常传递。于保证数据在不同模块之间的正常传递。模块之间关系尽量简单模块之间关系尽量简单 模块之间关系要尽量简单,且不互相干扰,做到模块之模块之间关系要尽量简单,且不互相干扰,做到模块之间只有在相互调用时才发生数据传递。除此之外,相互之间间只有在相互调用时才发生数据传递。除此之外,相互之间不直接发生联系。不直接发生联系。第5章 函数 模块规模大小要适中模块规模大小要适中 程序模块不宜过大,也不要过于复杂,大小要适中。模程序模块不宜过大,也不要过于复杂,大小要适中。模块过大,容易造成程序功

7、能紊乱,可读性差,不好理解。模块过大,容易造成程序功能紊乱,可读性差,不好理解。模块过小,容易造成程序结构复杂,数据传递容易出错。块过小,容易造成程序结构复杂,数据传递容易出错。模块尽量保持通用性模块尽量保持通用性 模块应尽量规范,保持一定的通用性,这样便于对模块模块应尽量规范,保持一定的通用性,这样便于对模块进行修改和维护,快速实现对程序的扩充。进行修改和维护,快速实现对程序的扩充。第5章 函数一、函数的分类与定义一、函数的分类与定义函数可以分为函数可以分为函数可以分为函数可以分为无参函数无参函数无参函数无参函数 和和和和有参函数有参函数有参函数有参函数。函数可以分为函数可以分为函数可以分为

8、函数可以分为标准函数标准函数标准函数标准函数 和和和和自定义函数自定义函数自定义函数自定义函数。有一个或多个形参无形参由系统提供,可直接使用由用户自己定义使用第5章 函数二、函数的定义二、函数的定义1 1无参函数定义的一般形式:无参函数定义的一般形式:函数类型说明符函数类型说明符 函数名()函数名()函数体函数体 例如:例如:printstar()printstar()printf(*n);printf(*n);第5章 函数2 2有参函数定义的一般形式:有参函数定义的一般形式:函数类型说明符函数类型说明符 函数名(形参表列)函数名(形参表列)函数体函数体 例如:例如:int fmax(int

9、x,int y)int fmax(int x,int y)int z;int z;if(xy)if(xy)z=x;z=x;else z=y;else z=y;return z;return z;第5章 函数说明:说明:C C语言规定:函数不允许嵌套定义。语言规定:函数不允许嵌套定义。函数之间是平行的、相对独立的。一个函数的定义可函数之间是平行的、相对独立的。一个函数的定义可 以放以放在程序中的任何一个位置,但在一个函数的函数体内,不能再定在程序中的任何一个位置,但在一个函数的函数体内,不能再定义另外一个函数。义另外一个函数。函数的类型是指函数返回值的类型,可以是整型、实型、函数的类型是指函数返

10、回值的类型,可以是整型、实型、字符型、指针类型等等数据类型,如果函数没有返回值,则函数字符型、指针类型等等数据类型,如果函数没有返回值,则函数类型为类型为voidvoid。函数名必须符合标识符的命名规则,函数名不能与变量名函数名必须符合标识符的命名规则,函数名不能与变量名重名,也不能与关键字同名。重名,也不能与关键字同名。函数体包含两部分:语句声明部分和执行语句部分。函数体包含两部分:语句声明部分和执行语句部分。空函数空函数既无参数,又无函数体,其一般形式为:既无参数,又无函数体,其一般形式为:函数类型说明符函数类型说明符 函数名函数名()()第5章 函数 函数的调用在定义一个函数后,要调用该

11、函数才能执函数的调用在定义一个函数后,要调用该函数才能执行该函数的功能,否则,该函数在程序中只是一段静态的行该函数的功能,否则,该函数在程序中只是一段静态的代码,不起任何作用代码,不起任何作用。1.1.1.1.函数调用的一般形式函数调用的一般形式函数调用的一般形式函数调用的一般形式 函数名(实参表列)函数名(实参表列)函数名(实参表列)函数名(实参表列)注意:注意:实参表列的形式为:实际参数实参表列的形式为:实际参数1 1,实际参数实际参数2 2,实参,实参可以是常量或变量,也可以是各种表达式。可以是常量或变量,也可以是各种表达式。实际参数的个数和类型应该与函数定义时的形式参数的个实际参数的个

12、数和类型应该与函数定义时的形式参数的个数和类型一致,并一一对应。数和类型一致,并一一对应。例如:例如:c=max(a,b);c=max(a,b);调用无参函数时,不能有实参表列。调用无参函数时,不能有实参表列。三、函数的调用三、函数的调用第5章 函数2.2.函数调用的具体方式函数调用的具体方式 函数语句函数语句把函数调用作为一个语句。其一般形式为:把函数调用作为一个语句。其一般形式为:函数名(实际参数表);函数名(实际参数表);该方式常用于调用一个可以忽略返回值或没有返该方式常用于调用一个可以忽略返回值或没有返回值的函数。例如程序中的回值的函数。例如程序中的scanf()scanf()函数和函

13、数和printf()printf()函函数的调用。数的调用。第5章 函数 函数表达式函数表达式 函数调用出现在表达式中,这种表达式称为函数表函数调用出现在表达式中,这种表达式称为函数表达式。其一般形式为:达式。其一般形式为:变量名变量名=函数表达式;函数表达式;这种方式用于调用带返回值的函数,函数的返回值这种方式用于调用带返回值的函数,函数的返回值将参加表达式的运算。将参加表达式的运算。例如程序中的例如程序中的max=maxnum(i,j,k);第5章 函数 函数实参函数实参 函数作为另一个函数调用的实参出现,这种方式是函数作为另一个函数调用的实参出现,这种方式是把该函数的返回值作为实参进行传

14、送,因此,要求把该函数的返回值作为实参进行传送,因此,要求该函数必须有返回值。该函数必须有返回值。例如:例如:max=fmax(a,fmax(b,c);第5章 函数四、函数的说明四、函数的说明C C语言规定:函数调用之前必须对该函数进行定义或说明。语言规定:函数调用之前必须对该函数进行定义或说明。函数的定义可以写在程序中的任何位置,但如果被调函数定义函数的定义可以写在程序中的任何位置,但如果被调函数定义在主调函数之后,则在主调函数中必须要对被调函数进行说明,在主调函数之后,则在主调函数中必须要对被调函数进行说明,这样在函数调用的时候才能够找到函数原型。这样在函数调用的时候才能够找到函数原型。函

15、数原型的一般形式是:函数原型的一般形式是:函数类型说明符函数类型说明符 函数名(参数类型函数名(参数类型1 1,参数类型,参数类型2 2,)例如:例如:int maxnum(int,int,int);int maxnum(int,int,int);函数类型说明符函数类型说明符 函数名(参数类型函数名(参数类型1 1 参数名参数名1 1,参数类型,参数类型 2 2 参数名参数名2 2,)例如:例如:int maxnum(int x,int y,int z);int maxnum(int x,int y,int z);第5章 函数五、函数的参数 在函数调用的过程中,两个函数之间的数据传递是靠在函数

16、调用的过程中,两个函数之间的数据传递是靠参数和返回值来传递的,主调函数利用参数将数据传给参数和返回值来传递的,主调函数利用参数将数据传给被调函数,被调函数的运行结果通过返回值传回给主调被调函数,被调函数的运行结果通过返回值传回给主调函数。函数。#include stdio.hmain()int x,y,z;scanf(%d,%d,&x,&y);z=max(x,y);printf(%d,z);int max(int a,int b)int c;if(ab)c=a;else c=b;return c;第5章 函数在调用函数时,函数名在调用函数时,函数名后面括号中的数据称为后面括号中的数据称为实际参

17、数(简称实参)实际参数(简称实参)实参实参与与形参形参的区别的区别在定义函数时函数名后面在定义函数时函数名后面的括号中的变量称为形式的括号中的变量称为形式参数(简称形参)。参数(简称形参)。在被调函数中出现在被调函数中出现在主调函数中出现。在主调函数中出现。变量变量变量、常量、表达式变量、常量、表达式 具体的数值具体的数值 存储数值的空间存储数值的空间 单向值传递单向值传递第5章 函数说明:说明:形参在被调函数中出现,实参在主调函数中出现。形参在被调函数中出现,实参在主调函数中出现。形参是在函数被调用时临时分配存储单元的,一旦调用结形参是在函数被调用时临时分配存储单元的,一旦调用结束,形参所占

18、的存储单元立即被释放。束,形参所占的存储单元立即被释放。实参可以是常量、变量或表达式,但必须是确定的值;形实参可以是常量、变量或表达式,但必须是确定的值;形参必须是变量。因为实参是函数在调用刚开始时传递的具体数参必须是变量。因为实参是函数在调用刚开始时传递的具体数据,所以必须是确定的值;形参是用来接受数据的,只有在内据,所以必须是确定的值;形参是用来接受数据的,只有在内存中占有存储空间才能存放数据,因此,形参必须是变量。存中占有存储空间才能存放数据,因此,形参必须是变量。在定义函数时,必须指定形参类型。形参实际上就是定义在定义函数时,必须指定形参类型。形参实际上就是定义的变量,如果不指定变量的

19、类型,将无法分配内存单元。的变量,如果不指定变量的类型,将无法分配内存单元。第5章 函数 实参传递给形参的实际值必须与函数定义中的形参类型一实参传递给形参的实际值必须与函数定义中的形参类型一致。不一致时要在主调函数中对被调函数作说明。致。不一致时要在主调函数中对被调函数作说明。调用语句中的实参个数应与被调用函数的形参个数相等,调用语句中的实参个数应与被调用函数的形参个数相等,其类型、顺序必须一一对应。其类型、顺序必须一一对应。实参和形参在内存里占用不同的存储空间,即使同名也不实参和形参在内存里占用不同的存储空间,即使同名也不会相互影响。会相互影响。C语言规定:实参对形参的传递是值传递,即单向传

20、递,语言规定:实参对形参的传递是值传递,即单向传递,只能由实参传给形参,而不能由形参传给实参。只能由实参传给形参,而不能由形参传给实参。第5章 函数六、函数的返回值六、函数的返回值 任何函数都是有值的,如果值是恒定的,可以返回,则有返回任何函数都是有值的,如果值是恒定的,可以返回,则有返回值;如果值不恒定,无法返回,则没有返回值。函数的返回值是值;如果值不恒定,无法返回,则没有返回值。函数的返回值是用用returnreturn语句来实现的。语句来实现的。returnreturn语句的格式有两种:语句的格式有两种:return r;return r;或或return(r);return(r);其

21、中其中r r为返回值,且从该函数返回。为返回值,且从该函数返回。r r可以是常量、变量、可以是常量、变量、表达式,也可以是函数调用。表达式,也可以是函数调用。注意:如果函数没有返回值,可以事先说明该函数的类型注意:如果函数没有返回值,可以事先说明该函数的类型 是是voidvoid型(即空类型)型(即空类型)第5章 函数说明:说明:函数类型应与返回值的类型保持一致,如果类型不一致,则函数类型应与返回值的类型保持一致,如果类型不一致,则以函数类型为准。以函数类型为准。若函数中无若函数中无returnreturn语句,并不是不带回返回值,只是不带回语句,并不是不带回返回值,只是不带回有用的值,所以若

22、不需要有返回值,则函数类型说明符为有用的值,所以若不需要有返回值,则函数类型说明符为voidvoid,以明确表示不带回值。以明确表示不带回值。一个函数一次只能返回一个返回值。一个函数一次只能返回一个返回值。#include stdio.h#include stdio.hmain()main()int a=2,b=3,c;int a=2,b=3,c;int f(int x,int y);int f(int x,int y);c=f(a,b);c=f(a,b);printf(f(%d,%d)=%dn,a,b,c),printf(f(%d,%d)=%dn,a,b,c),int f(int x,int

23、 y)int f(int x,int y)int z;int z;z=xy?x+:y+z=xy?x+:y+;return z;return z;例例5-25-2第5章 函数一、一、函数的嵌套调用函数的嵌套调用 C C语言中,函数的定义是相对独立的、平行语言中,函数的定义是相对独立的、平行的,没有隶属关系,函数不能嵌套定义,但的,没有隶属关系,函数不能嵌套定义,但可以嵌套调用。即在调用一个函数的过程中,可以嵌套调用。即在调用一个函数的过程中,又可以调用另外的函数。又可以调用另外的函数。第5章 函数main()main()函数函数 f1()f1()函数函数 f2()f2()函数函数 调调用用f1(

24、)f1()函数函数 调调用用f2()f2()函数函数 结结束束 返回返回 返回返回main()int f1(int x,int y)int f2(int m,int n).c=f1(a,b);z=f2(m,n);.第5章 函数例例 5-3 5-3 求求S=1S=1K K+2+2K K+3+3K K+n+nk k的值的值分析:本题可以用三个不同的函数来分别描述。分析:本题可以用三个不同的函数来分别描述。f1 f1函数计算函数计算n nk k f2 f2函数求函数求S=1S=1K K+2+2K K+3+3K K+n+nk k main()main()函数输入、输出初始条件和最后结果。函数输入、输出

25、初始条件和最后结果。#include stdio.h#include stdio.hlong f1(int n,int k)long f1(int n,int k)long power=n;long power=n;int i;int i;for(i=1;ik;i+)for(i=1;ik;i+)power*=n;power*=n;return power;return power;long f2(int n,int k)long f2(int n,int k)long sum=0;long sum=0;int i;int i;for(i=1;i=n;i+)for(i=1;i=n;i+)sum+

26、=f1(i,k);sum+=f1(i,k);return sum;return sum;main()main()int n,k;int n,k;printf(“input n printf(“input n,k:);k:);scanf(“%dscanf(“%d,%d,&n,&k),%d,&n,&k);printf(%dn,f2(n,k);printf(%dn,f2(n,k);第5章 函数二、二、函数的递归调用函数的递归调用 在函数的调用过程中,允许直接或间接地调用函数在函数的调用过程中,允许直接或间接地调用函数自身,这种调用称为递归调用。自身,这种调用称为递归调用。函数直接自己调用自己,为直接

27、递归。函数间接自己调用自己,为间接递归。第5章 函数例例5-3 5-3 求整数n!#include stdio.h#include stdio.hlong fact(int n);long fact(int n);main()main()int i;int i;long fac;long fac;printf(i=);printf(i=);scanf(%d,&i);scanf(%d,&i);fac=fact(i);fac=fact(i);printf(%d printf(%d的阶乘等于的阶乘等于%ldn,i,fac);%ldn,i,fac);long fact(int n)long f;if(

28、n=0)f=1;else f=n*fact(n-1);return f;第5章 函数例例5-4 5-4 已知某数列为已知某数列为K(n)K(n)的定义如下,求该数列的第六项的定义如下,求该数列的第六项K(6)K(6)。1 n=1 1 n=1K(n)=K(n-1)*2 nK(n)=K(n-1)*2 n为偶数为偶数 K(n-1)*3 n K(n-1)*3 n为奇数为奇数main()main()int i;float j;int i;float j;printf(input printf(input the number:);the number:);scanf(%d,&i);scanf(%d,&i

29、);if(i=0)if(i=0)printf(n=0,data error!n);printf(n1)(2*x-1)*p(n-1,x)*x-(n-1)*p(n-2,x)/n (n1)第5章 函数#include Stdio.h#include Stdio.hfloat p(int n,int x)float p(int n,int x)float pp;float pp;if(n=0)pp=1;if(n=0)pp=1;else if(n=1)pp=x;else if(n=1)pp=x;else pp=(2*x-1)*p(n-1,x)*x-(n-1)*p(n-1,x)/n;else pp=(2*

30、x-1)*p(n-1,x)*x-(n-1)*p(n-1,x)/n;return pp;return pp;main()main()float f;float f;int n,x;int n,x;printf(input the n,x:);printf(input the n,x:);scanf(%d,%d,&n,&x);scanf(%d,%d,&n,&x);f=p(n,x);f=p(n,x);printf(%f,f);printf(%f,f);第5章 函数一、变量的作用域和生存期一、变量的作用域和生存期 变量的作用域变量的作用域变量的生存期变量的生存期变量在程序变量在程序中影响范围中影响范围

31、变量在程序中变量在程序中起作用的时间起作用的时间长期性长期性暂时性暂时性全局变量全局变量局部变量局部变量第5章 函数局部变量局部变量 变量只能在当前函数或变量只能在当前函数或 当前复合语句中有效。当前复合语句中有效。形式参数是局部变量。形式参数是局部变量。可以在复合语句中定义可以在复合语句中定义 局部变量。局部变量。局部变量可以同名,互局部变量可以同名,互 不干扰。不干扰。全局变量全局变量 在整个程序中有效有效。在整个程序中有效有效。全局变量可以和局部变量同名,全局变量可以和局部变量同名,互不干扰,全局变量之间不能同互不干扰,全局变量之间不能同名。名。在同一个程序中,如果全局变在同一个程序中,

32、如果全局变量与局部变量同名,在局部变量量与局部变量同名,在局部变量的作用范围内,全局变量暂时不的作用范围内,全局变量暂时不起作用,被屏蔽。起作用,被屏蔽。通常情况,建议尽量少使通常情况,建议尽量少使 用全局变量用全局变量第5章 函数#include stdio.h#include stdio.hint a=3,b=5;int a=3,b=5;max(int a,int b)max(int a,int b)int c;int c;c=ab?a:b;c=ab?a:b;return c;return c;main()main()int a=8;int a=8;printf(%d,printf(%d,

33、max(a,b);max(a,b);第5章 函数二、变量的存贮类别二、变量的存贮类别数据的动态存贮方式和静态存贮方式数据的动态存贮方式和静态存贮方式程序区程序区动态存贮区动态存贮区静态存贮区静态存贮区存放程序指令存放程序指令存放暂时性数据存放暂时性数据 (局部变量)(局部变量)存放数据长期性存放数据长期性 (全局变量)(全局变量)第5章 函数在在C C语言中变量的存贮类别有四种语言中变量的存贮类别有四种自动型变量自动型变量外部型变量外部型变量静态型变量静态型变量寄存器型变量寄存器型变量说明:说明:autoauto作用域:局部作用域:局部生存期:暂时生存期:暂时存贮区:动态区存贮区:动态区说明:

34、说明:externextern作用域:全局作用域:全局生存期:长期生存期:长期存贮区:静态区存贮区:静态区说明:说明:staticstatic作用域:局部或作用域:局部或 全局全局生存期:长期生存期:长期存贮区:静态区存贮区:静态区说明:说明:registerregister作用域:局部作用域:局部生存期:暂时生存期:暂时存贮区:寄存器存贮区:寄存器第5章 函数自动型变量自动型变量autoauto 出现范围:出现在函数内部。出现范围:出现在函数内部。判别方法:判别方法:定义在函数内部并且缺省存储类别说明定义在函数内部并且缺省存储类别说明 直接直接autoauto显式说明显式说明 作用域:定义该

35、变量的函数或复合语句。作用域:定义该变量的函数或复合语句。生存期:定义该变量的函数或复合语句被执行期间,是局部。生存期:定义该变量的函数或复合语句被执行期间,是局部。存贮区域:动态存贮区存贮区域:动态存贮区注意:注意:自动变量一般省略自动变量一般省略autoauto,函数中的大多数变量都是自动变量。,函数中的大多数变量都是自动变量。形参和复合语句里定义的变量也是自动变量。形参和复合语句里定义的变量也是自动变量。自动变量一旦被说明,则只能在说明该变量的函数或复合语句自动变量一旦被说明,则只能在说明该变量的函数或复合语句 中出现才有效,离开了上述区域则无效。中出现才有效,离开了上述区域则无效。生存

36、期只限于相应函数被调用时,若变量是定义在复合语句生存期只限于相应函数被调用时,若变量是定义在复合语句 内,则其生存期为该复合语句被执行的期间。内,则其生存期为该复合语句被执行的期间。第5章 函数例例 5-7 5-7#include stdio.h#include stdio.hmain()main()int a=1;int a=1;f(a);f(a);f(a);f(a);int f(int a)int f(int a)int b;int b;b=a+;b=a+;printf(%2d,b);printf(%2d,b);/*a是局部变量,作用域为是局部变量,作用域为main函数内函数内*/*a、b

37、都是局部变量,作用域为都是局部变量,作用域为f函数内,函数内,生存期在调用生存期在调用f函数时函数时*/第5章 函数例例5-85-8#include stdio.h#include stdio.hmain()main()int a=3;int a=3;int a=2;int a=2;printf(%2d,a+);printf(%2d,a+);int a=0;int a=0;printf(%2d,a+);printf(%2d,a+);printf(%2d,a+);printf(%2d,a+);第5章 函数外部型变量外部型变量externextern 出现范围:可以出现在程序中的任何说明部分。出现

38、范围:可以出现在程序中的任何说明部分。判别方法:判别方法:在函数外部定义,并且缺省在函数外部定义,并且缺省externextern的变量的变量 用用externextern显式说明的变量。显式说明的变量。作用域:从定义该变量的位置起直到本文件结束。作用域:从定义该变量的位置起直到本文件结束。生存期:整个程序的执行期。生存期:整个程序的执行期。存贮区域:静态存贮区域存贮区域:静态存贮区域注意:注意:外部型变量长驻数据的静态存贮区。外部型变量长驻数据的静态存贮区。外部变量在编译时创建,它只能初始化一次,如外部变量在编译时创建,它只能初始化一次,如 果在定义时没有初始化,系统默认值为果在定义时没有初

39、始化,系统默认值为0 0。外部变量能被同名的内部变量所屏蔽。外部变量能被同名的内部变量所屏蔽。第5章 函数例例5-95-9#include stdio.h#include stdio.hint a,b;int a,b;main()main()a=1;a=1;fun();fun();fun();fun();int fun()int fun()b=a+;b=a+;printf(%5d,b);printf(%5d,b);例例5-105-10#include stdio.h#include stdio.hint a,b;int a,b;main()main()a=1;a=1;fun(a);fun(a)

40、;fun(a);fun(a);int fun(int a)int fun(int a)b=a+;b=a+;printf(%5d,b);printf(%5d,b);第5章 函数静态变量静态变量staticstatic静态变量分成静态变量分成静态局部变量静态局部变量和和静态全局变量静态全局变量。静态局部变量静态局部变量出现范围:出现在出现范围:出现在函数内部。函数内部。判别方法:用判别方法:用staticstatic说明的、定义在函说明的、定义在函数内部的变量。数内部的变量。作用域:定义该变作用域:定义该变量的函数。量的函数。生存期:整个程序生存期:整个程序的执行期。的执行期。静态全局变量静态全局

41、变量出现范围:可以出现在程序的出现范围:可以出现在程序的任何说明部分。任何说明部分。判别方法:用判别方法:用staticstatic说明的、定说明的、定义在函数外部的变量。义在函数外部的变量。作用域:从定义该变量的位置作用域:从定义该变量的位置直至本源文件结束。直至本源文件结束。生存期:整个程序的执行期。生存期:整个程序的执行期。在程序设计中希望某些外部变量只在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他限于被本文件引用,而不能被其他文件引用,则可以使用静态全局变文件引用,则可以使用静态全局变量量。第5章 函数注意:注意:静态局部变量的作用域在定义该变量的函数内,生存期静态局部变

42、量的作用域在定义该变量的函数内,生存期 是整个程序的执行期。要改变该变量的值,必须在函数是整个程序的执行期。要改变该变量的值,必须在函数 内部完成,相对于外部变量而言,静态变量更安全,起到内部完成,相对于外部变量而言,静态变量更安全,起到 了信息屏蔽的作用,因此,静态变量的应用比较广泛。了信息屏蔽的作用,因此,静态变量的应用比较广泛。静态变量初始化语句只在第一次调用该函数时才执行,静态变量初始化语句只在第一次调用该函数时才执行,以后每次调用该函数就不再执行初始化语句。以后每次调用该函数就不再执行初始化语句。静态变量只能初始化一次,如果没有初始化,则编译自静态变量只能初始化一次,如果没有初始化,

43、则编译自 动赋初值动赋初值0 第5章 函数例例5-115-11#include stdio.h#include stdio.hint fun(int a)int fun(int a)int b=0;int b=0;static int c=3;static int c=3;b+;b+;c+;c+;return(a+b+c);return(a+b+c);main()main()int a=2,i;int a=2,i;for(i=0;i3;i+)for(i=0;i3;i+)printf(%5d,fun(a);printf(%5d,fun(a);getch();getch();例例5-125-12#

44、include stdio.h#include stdio.hint fun(int n)int fun(int n)static int f=1;static int f=1;f=f*n;f=f*n;return f;return f;main()main()int i;int i;for(i=1;i=5;i+)for(i=1;i=5;i+)printf(%d!=%dn,i,fun(i);printf(%d!=%dn,i,fun(i);getch();getch();第5章 函数寄存器变量寄存器变量registerregister 出现范围:出现在函数内部。出现范围:出现在函数内部。判别方法

45、:用判别方法:用registerregister声明的、在函数内部的变量。声明的、在函数内部的变量。作用域:在定义该变量的函数内。作用域:在定义该变量的函数内。生存期:定义该变量的函数被调用的期间。生存期:定义该变量的函数被调用的期间。存贮区域:寄存器变量不是存放在内存里,而是存放在存贮区域:寄存器变量不是存放在内存里,而是存放在CPU CPU 的寄存器里,它的特点是存取速度快,如果变量存取的寄存器里,它的特点是存取速度快,如果变量存取很频繁,比如循环变量,则可以定义成寄存器变量以提高很频繁,比如循环变量,则可以定义成寄存器变量以提高程序的执行速度。程序的执行速度。注意:注意:只有自动变量和形

46、参可以作为寄存器变量。只有自动变量和形参可以作为寄存器变量。静态变量和外部变量不能定义为寄存器变量。静态变量和外部变量不能定义为寄存器变量。第5章 函数例例5-135-13#include stdio.h#include stdio.hint sum(int n)int sum(int n)register int i;register int i;int s=0;int s=0;for(i=1;i=n;i+)for(i=1;iy?x:y#define MAX(x,y)xy?x:ymain()main()int x,y,z;int x,y,z;scanf(%d,%d,&x,&y);scanf(

47、%d,%d,&x,&y);z=MAX(x,y);z=MAX(x,y);printf(%d,z);printf(%d,z);第5章 函数注意:注意:宏名和形参表列之间不能有空格出现。宏名和形参表列之间不能有空格出现。形参应为变量,实参可以是常量、也可以是具体表达式。形参应为变量,实参可以是常量、也可以是具体表达式。为了避免出错,通常用括号将宏定义中形参括起来。为了避免出错,通常用括号将宏定义中形参括起来。例如例如:#define fun(x)y*y#define fun(x)y*y 如果如果y=fun(x+1);y=fun(x+1);经过宏替换后,经过宏替换后,y y的值为的值为x+1*x+1x

48、+1*x+1。#define fun(x)(y)*(y)#define fun(x)(y)*(y)如果如果y=fun(x+1);y=fun(x+1);经过宏替换后,经过宏替换后,y y的值为的值为(x+1)*(x+1)(x+1)*(x+1)。可以看出:上面两种情况下的可以看出:上面两种情况下的y y 值明显不同。值明显不同。第5章 函数3.文件包含处理文件包含处理文件包含的一般形式如下:文件包含的一般形式如下:#include#include 文件名文件名 例如:例如:#include file1.h“#include file1.h“就是将源文件就是将源文件file1.hfile1.h的全部

49、内容包含到当前文件中来,形成的全部内容包含到当前文件中来,形成 一个新的源文件,这样便于编译链接。一个新的源文件,这样便于编译链接。如果在程序中使用了标准库函数,应在程序的开头用如果在程序中使用了标准库函数,应在程序的开头用#include将将其头文件包含进来,否则,编译链接时将会出现错误。其头文件包含进来,否则,编译链接时将会出现错误。C语言程序允许文件包含嵌套。语言程序允许文件包含嵌套。第5章 函数普通函数设计方法普通函数设计方法#include stdio.h#include stdio.hint fmax(int x,int y)int fmax(int x,int y)int z;i

50、nt z;if(xy)z=x;if(xy)z=x;else z=y;else z=y;return z;return z;main()main()int a,b,c,max;int a,b,c,max;printf(printf(输入三个整数:输入三个整数:););scanf(%d%d%d,&a,&b,&c);scanf(%d%d%d,&a,&b,&c);max=fmax(a,fmax(b,c);max=fmax(a,fmax(b,c);printf(max=%dn,max);printf(max=%dn,max);h901.c#include stdio.h#include stdio.hi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com