第7章函数.ppt

上传人:少林足球 文档编号:3852317 上传时间:2019-09-30 格式:PPT 页数:114 大小:2.19MB
返回 下载 相关 举报
第7章函数.ppt_第1页
第1页 / 共114页
第7章函数.ppt_第2页
第2页 / 共114页
第7章函数.ppt_第3页
第3页 / 共114页
第7章函数.ppt_第4页
第4页 / 共114页
第7章函数.ppt_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《第7章函数.ppt》由会员分享,可在线阅读,更多相关《第7章函数.ppt(114页珍藏版)》请在三一文库上搜索。

1、第7章 函数,-模块化设计,主要内容,一、概述 二、函数定义的一般形式 三、函数参数和函数的值 四、函数的调用 五、函数的嵌套调用 六、函数的递归调用 七、数组作为函数参数 八、变量的存储类别 九、内部函数和外部函数 十、运行一个多文件的程序,一、概述 1、函数的概念:一个子程序段,能完成特定的功能。 存在位置:,1.c,2.h,函数1,函数3,函数2,函数4,函数5,(1) 各函数包含在一个文件中 #include void main( ) void printstar( ); void print_message( ); printstar( ); print_message( ); pr

2、intstar( ); void printstar( ) printf (“* n” ); void print_message( ) printf (“_ _ _ _ _How_do_you_do!n”) ;,运行结果: * How do you do! * *,一、概述,(2)文件包含的方法 在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。 #include “T7-1-2.c” #include “T7-1-3.c” main( ) p1( ); p2( ) ; p1( ) ; 运行结果同上

3、,T7-1-2.c p1( ) printf (“* n”); ,T7-1-3.c p2( ) printf (“ How do you do! n”); ,一、概述,例:在屏幕上输出“How do you do ?”,stdio.h,printf函数,函数3,函数2,#include void main() printf(“How do you do ?”); ,3.c,一、概述,2、函数调用方式:,一、概述,几点说明: (1)一个源文件由一个或者多个函数组成。 (2)一个C程序由一个或者多个源文件组成。 (3)C程序的执行从main 函数开始。 (4)所有的子函数都是平行的。 (5)从用户

4、的角度看,函数分库函数和自定义函数。 (6)函数形式: 无参函数:主调函数无数据传送给被调函数,可带或不带返回值。 有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参, 被调函数的数据可返回主调函数。,一、概述,二、函数定义的一般形式 1、无参函数的定义形式 类型标识符: 用于指定函数带回的值的类型,不写时为int型。 不带回值时可以不写。,类型标识符 函数名() 说明部分 语句 ,例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,合法标识符,函数体,2、有参函数定义的一般形式,函

5、数返回值类型 隐含为int型,函数体,例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); ,例 有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); ,二、函数定义的一般形式,3、空函数 为扩充功能预留,在主调函数中先占一个位置。,类型标识符 函数名() ,例 空函数 dummy( ) ,函数体为空,二、函数定义的一般形式,三、函数参数和函数的值 1、形式参数和实际参数 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,例

6、 比较两个数并输出大者 #include void main() int max(int x,int y); int a,b,c; scanf(“%d,%d“,运行:7,8 Max is 8,几点说明: 实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组首地址。 形参必须指定类型,只能是简单变量或数组,不能是常量或表达式 形参与实参类型一致,个数相同顺序相同。 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放 实参对形参的数据传送是值传送,也是单向传送,当被

7、调函数的形参发生变化时,并不改变主调函数实参的值。形、实参占据的是不同的存储单元,三、函数参数和函数的值,例:形、实参占据的是不同的存储单元 #include void main( ) void add(int x,int y); int a=2,b=3; printf (“a=%d, b=%dn”,a, b); printf(“ ,运行结果: a=2,b=3 &a=ffd6,&b=ffd8 x=10,y=15 &x=ffd2,&y=ffd4 a=2, b=3 &a=ffd6,&b=ffd8,2、函数的返回值 返回语句形式: return(表达式);或 return 表达式; 功能:使程序控制

8、从被调用函数返回到调用函数中,同时把返值带给调用函数,三、函数参数和函数的值,说明: 函数的返回值,必须用 return 语句带回。 return 语句只能把一个返值传递给调用函数。 函数中可有多个return语句,执行哪一个由程序执行情况来定。 if(ab) return(a); else return(b); return 后的值可以是一个表达式,如:return(x y ? x : y); 返回值的类型为定义的函数类型,不指定的按整型处理。 如: int max(int x, int y) float min(float a,float b) double abc(float d1,fl

9、oat d2),三、函数参数和函数的值,-若 return 语句中表达式类型与函数类型不一致,则转换为函数类型。 -若无return语句,遇时,自动返回调用函数。可能返回一个不确定或无用的值 。 -无返回值的函数,定义为 void 类型。,printstar() printf(“*“); void main() int a; a=printstar(); printf(“%d“,a); ,例:无return语句,函数带回不确定值,void printstar() printf(“*“); void main() int a; a=printstar(); printf(“%d“,a); ,三、

10、函数参数和函数的值,四、 函数的调用 主调函数:主动去调用其它函数 被调函数:被其它函数所调用 1、函数调用的一般形式 函数名(实参表列) 说明: 实参表列:有确定值的数据或表达式 实参与形参个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用“ ,”分隔 实参表求值顺序,因系统而定(Turbo C 自右向左) 调用无参函数时,实参表列为空,但( )不能省,#include void main() int f(int a,int b); int i=2,p; p=f(i,+i); printf(“%d“,p); int f(int a, int b) int c; if(ab) c=1

11、; else if(a=b) c=0; else c=-1; return(c); ,例 参数求值顺序,按自右向左求值 函数调用等于f(3,3) 运行结果:0,按自左向右求值 函数调用等于f(2,3) 运行结果:- 1,为使程序有通用性:,需自右向左求值时, 改为:j=+i; p=f ( j , j ) ;,需自左向右求值时, 改为:j = i ; k = + i ; p = f ( j , k ) ;,Printf(“%d,%d”,i,i+); /*同样存在此情况*/,2、函数调用的方式 按函数在程序中出现的位置,有三种调用方式: 函数语句:以独立的语句去调用函数。不要求有返回值,仅完成一定

12、的操作。 例 printstar(); printf(“Hello,World!n”); 函数表达式: 函数返回一个确定值,以参加表达式的运算。不可用于void 例 m=max(a,b)*2; 函数参数:函数调用作为另一个函数的参数。 例 printf(“%d”,max(a,b); /*输出大数*/ m=max(a,max(b,c); /*三数比大小*/,四、 函数的调用,3、函数声明 一般形式: 函数类型 函数名(形参类型 形参名, ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数声明不同,声明只与函数定义的第一行相同。声明可以不写形参名

13、,只写形参类型。 函数说明位置:程序的数据说明部分(函数内或外),四、 函数的调用,对被调用函数要求: 必须是已存在的函数 库函数: #include 用户自定义函数:如果被调函数定义在主调函数之后,那么在主调函数中对被调函数作声明。,四、 函数的调用,#include void main() float add(float x,float y ); /*对被调用函数的声明*/ float a,b,c; scanf(“%f,%f“, ,float add(float,float);,例 对被调用的函数作声明,输入:3.6 ,6.5 输出:sum is 10.100000,说明: 旧版本C中函数

14、声明不采用函数原型,只声明函数名和函数类型。如: float add( ) 函数调用之前,如果未对函数作声明,则编译系统把第一次遇到的函数形式作为函数声明,并默认为int型。即:函数类型是int型可以不作函数声明,最好作声明。 被调用函数的定义(程序)在主调函数之前,可以不加函数声明。 在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。,四、 函数的调用,回顾:,源程序,Main函数 函数2 函数3,要点一:如何写函数?,确定函数完成功能; 确定函数与外界数据交换方式。,例:请写一个求 n! 的函数。,确定函数完成功能:计算 n!,int s=1,i; for(i=

15、2;i=n;i+) s=s*i;, 确定函数与外界数据交换方式。 I、n由形式参数传入; II、计算的结果n!通过返回一个值出去,nfactorial( int n),int s=1,i; for(i=2;i=n;i+) s=s*i;,int,return(s);,要点二:如何调用函数? 函数名(实参); 或 变量名=函数名(实参);,例:在main中调用 n!函数,n由键盘输入。,void main() int a,b; printf(“input n: ”); scanf(“%d”, ,int nfactorial( int n) int s=1,i; for(i=2;i=n;i+) s=

16、s*i; return(s);,int nfactorial( int n);,4、函数调用的执行过程,四、 函数的调用,五、 函数的嵌套调用,例 输入两个整数,求平方和,输入: 3 4 输出: The result is: 25,int fun2(int m) return (m*m); ,int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) ); ,#include int fun1(int x,int y); void main(void) int a,b; scanf(“%d%d”, ,#include int

17、dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() int a,b,c,d; scanf(“%d%d%d“, ,例 求三个数中最大数和最小数的差值,int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); ,int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); ,int dif(int x,int y,int z) return max(

18、x,y,z)-min(x,y,z); ,例 用弦截法求方程 的根,1. 取x1,x2两点,求得f(x1), f(x2) 。 异号:x1,x2之间必有一根。 同号:改变x1, x2,直到f(x1), f(x2)异号为止。,2. 连f(x1),f(x2)两点(弦)交x轴于x。 X点的坐标求法: 求X点的x坐标 从x值得f(x),3. 若f(x)与f(x1)同号, 则根必在(x,x2)区间,此时将x1=x; 若f(x)与f(x2)同号, 则根必在(x1,x)区间,此时将x2=x;,4. 重复步骤2和3 ,直到| f(x) | 为止, 设 10-6 , 则 f(x)0,用三个函数实现各部分的功能: 函

19、数f(x): 求x的函数:x3 - 5x2 +16x-80 函数xpoint(x1,x2): 求弦与x轴交点X的x坐标 函数root(x1, x2) : 求(x1, x2)区间的实根,#include #include float f(float x) float y; y=(x-5.0)*x+16.0)*x-80.0; return(y); float xpoint(float x1, float x2) float y; y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return(y);,float root(float x1,float x2) float x,

20、y, y1; y1=f(x1); do x=xpoint(x1, x2);y=f(x); if(y*y1 0) y1=y;x1=x; else x2=x; while(fabs(y) =0.0001); return(x); ,void main( ) float x1, x2, f1, f2, x; do printf(“input x1, x2: n”); scanf(“%f%f”, ,运行情况: Input x1,x2: 2,6 A root of equation is 5.0000,六、 函数的递归调用 递归:在函数调用过程中,直接或间接的调用自身。 递归调用方式 直接递归调用:在函

21、数体内又调用自身,int f(int x) int y,z; z=f(y); . return(2*z); ,间接递归调用:当函数1去调用另一函数2时,而另一函数2反过来又调用函数1自身。,解决无终止递归调用的方法是:确定好结束递归的条件。,六、 函数的递归调用,例 有5个人,第5个人比第4个人大2岁,第4个人比第3个人大2岁,第2个人比第1个人大2岁,第1个人10岁,问第5个人多大?,回推,递推,用函数age(n)来表示第n个人的年龄,程序实现: #include age(int n) int c; if (n=1) c=10; else c=2+age(n-1); return(c); v

22、oid main( ) printf(“%d n”, age(5);,运行结果:18,有些问题,可以用递推,也可以用递归的方法解决。 递推:从一个已知的事实出发,按一定规律推出下一个事实,再从已知的新的事实,推出下一个新的事实.,例 用递推法求n! ,即从1开始, 乘2, 乘3一直到n,#include void main( ) int i, s=1; for(i=1;i=5;i+) s=s* i; printf(“s=%d n”,s); ,递归:在函数调用自身时,要给出结束递归的条件。,例 用递归方法求n!,5!=5 4! 4!=4 3! 3!=3 2! 2!=2 1! 1!=1 0!=1,

23、运行: input a integer number:10 10! = 3628800,程序实现: #include void main() float fac(int n); int k; float y; printf(“Input a integer number:“); scanf(“%d“,规则及分析: n个盘子从一个座移到另一个座,每次只能移动一个盘子,不允许大盘在小盘上面。,例 Hanoi(汉诺)塔问题,/ 汉诺塔,/ 汉诺塔,将A上n-1个盘子借助C移到B,/ 汉诺塔,将A上n-1个盘子借助C移到B,/ 汉诺塔,将A上n-1个盘子借助C移到B,/ 汉诺塔,把A上剩下一个盘子送到

24、C,/ 汉诺塔,把A上剩下一个盘子送到C,/ 汉诺塔,把A上剩下一个盘子送到C,/ 汉诺塔,把A上剩下一个盘子送到C,/ 汉诺塔,将n-1个盘子从B借助A移到C,/ 汉诺塔,将n-1个盘子从B借助A移到C,/ 汉诺塔,将n-1个盘子从B借助A移到C,/ 汉诺塔,将n-1个盘子从B借助A移到C,方法与步骤 将A上n-1个盘子借助C移到B 。 把A上剩下一个盘子送到C 将B上n-1个盘子借助A移到C,原问题:将A上n个盘子借助B移到 C,hanoi( n, A, B, C),hanoi( n-1, A, C, B),hanoi( n-1, B, A, C),mov(A, C),void hanoi

25、(int n,char one,char two,char three) void move(char x, char y); if (n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(char x, char y) printf(“%c-%cn“,x, y); ,#include void main() void hanoi(int n,char one,char two,char three); int m; printf(“In

26、put the number of diskes:“); scanf(“%d“,运行: input number of diskes: 3 the step to moving 3 diskes: A C A B C B A C B A B C A C,七、数组作为函数参数,2001H,数组首地址,数组元素,函数,传送,七、数组作为函数参数 1、数组元素作函数实参值传递,例 输入10个数,要求输出其中最大的元素和该数是第几个数。,思路:设计一个求两数中较大数的函数,max(int x, int y) 从首元素依次与各元素比较大小,记下大的值及其位置,a,0 1 2 3 4 5 6,m=a0,n

27、=0,i=1,依次比较:max(m,ai),#include void main() int max(int x,int y) int a10,m,n,i; printf(“Enter 10 integer numbers:“); for(i=0;im) m=max(m,ai); n=i; printf(“The largest number is %dn it is the %d th numbern”,m,n); ,int max(int x,int y) return(xy?x:y); ,2、数组名可作函数参数地址传递 实参和形参都应用数组名,传送是的数组首地址 (1)一维数组名作为函数

28、参数,实参:int score5; 形参: abc( int array5) 或 abc( int array ),注: 形参的数组大小可不指定,七、数组作为函数参数,例 求学生的平均成绩,float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver); ,float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) su

29、m=sum+arrayi; aver=sum/10; return (aver); ,#include void main() float average(float array10); float score10, aver; int i; printf(“Input 10 scores: n“); for( i=0; i10; i+ ) scanf(“%f“, ,实参用数组名,例 求两组学生的平均成绩,形参数组长度缺省,#include void main() float average(float array ,int n); float score_15=98.5,97,91.5,60

30、,55; float score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(“The average of clase A is %6.2fn”,average(score_1,5); printf(“The average of clase B is %6.2fn”,average(score_2,10); float average(float array ,int n) int i; float aver,sum=array0; for( i=1; in; i+ ) sum=sum+arrayi; aver=sum/n;

31、return (aver); ,另设一个参数,传递需要处理的数组元素个数,数组名作函数参数时,实参和形参两个数组共占同一段内存单元,形参数组的元素值改变会使实参数组元素的值同时变化。,七、数组作为函数参数,9,49,i=0,选择法排序思路,例 用选择法对数组中的10个整数按由小到大排序,13,68,i=1,选择法排序思路,i=8,选择法排序思路,void sort(int array ,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayi; arrayi=arrayk;

32、 arrayk=t; ,#include void main() void sort(int array ,int n); int a10,i; printf(“enter the arrayn”); for(i=0;i10;i+) scanf(“%d“,(2)用多维数组名作函数参数 形参数组定义时,只能省略第一维的大小说明。 实参数组定义:int score510 形参数组定义:int array310 或 int array810 或 int array 10 错误的定义:int array ; int array3 ;,七、数组作为函数参数,例 求34矩阵中各元素的最大值,#includ

33、e void main() int max_value(int array 4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(“max value is %dn“,max_value(a); ,多维形参数组第一维维数 可省略,第二维必须相同 int array4,int max_value(int array34) int i,j,k,max; max=array00; for(i=0;imax) max=arrayij; return(max); ,例 求二维数组中各行元素之和,18,12,形参,形参,get_sum_row(int x3, in

34、t result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0; for(j=0;jcol;j+) resulti+=xij; main() int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(“The sum of row%d=%dn“,i+1,sum_rowi); ,问题: 变量的逻辑位置? 变量的物理位置?,变量的逻辑位置,变量的物理位置,程序文件,内存, void m

35、ain() int a; ,2001H,八、局部变量和全局变量,#include int h; float f1(int a) int b,c; . main() int m,n; int i,j; . ,局部变量,全局变量,1、局部变量内部变量 定义:在函数内定义,只在本函数内有效 三类: 函数开头就定义的变量 形式参数变量 复合语句中定义的变量,注:不同函数中同名变量,占不同内存单元,八、局部变量和全局变量,局部变量的作用域,运行结果: main:a=3,b=4 sub:a=6,b=7 main:a=3,b=4,运行结果: main:a=3,b=4 sub:a=6,b=7 main:a=3

36、,b=4,2、全局变量外部变量 定义:在函数外定义,可为本文件所有函数共用,也叫外部变量。 有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,八、局部变量和全局变量,几点说明: 同一文件中的所有函数都能引用、改变全局变量的值。 习惯上,全局变量名的第一个字母用大写。 不必要时不要使用全局变量 全局变量在程序执行的全过程都占用存储单元。 不利于程序的移植。程序的可读性变差。 全局与局部变量重名时,在函数内部将屏蔽全局变量。,八、局部变量和全局变量,全局变量的作用域,例 全局变量的作用域及其使用情况,int a=1; f1( ) int b; b=a+3; print

37、f(“f1:a=%d, b=%d n”,a, b); f2( ) int a, b; a=5; b=a+3; printf(“f2: a=%d, b=%d n”,a, b); f3( ) int b; a=6; b=a+3; printf(“f3:a=%d, b=%d n”,a, b); void main( ) int b=3; printf(“1.main : a=%d, b=%d n”,a, b); f1( ); printf(“2.main : a=%d, b=%d n”,a, b); f2( ); printf(“3.main : a=%d, b=%d n”,a, b); f3( )

38、; printf(“4.main : a=%d, b=%d n”,a, b); ,运行: 1.main:a=1, b=3 f1:a=1, b=4 2.main:a=1, b=3 f2:a=5, b=8 3.main:a=5, b=3 f3:a=6, b=9 4.main:a=6, b=3,全局变量增加了函数间传送数据的联系,局部变量和全局变量同名,局部变量作用域中外部变量被屏蔽,局部变量,外部变量,例: 一维数组内存放了10个学生成绩,求平均分、最高分和最低分。,#include float Max=0,Min=0; void main() float average(float array

39、,int n); int i; float ave,score10; for(i=0;iMax) Max=arrayi; else if(arrayiMin) Min=arrayi; sum=sum+arrayi; aver=sum/n; return(aver);,运行:input 10 numbers: 99 45 78 97 100 67.5 89 92 66 43 max=100.00 min=43.00 average=77.65,九、变量的存储类别 程序执行过程:,CPU,控制器,运算器,寄存器,数据区,内存,取指令,取数,九、变量的存储类别 动态存储方式与静态存储方式 静态存储:

40、程序运行期间分配固定的存储空间。 动态存储:程序运行期间根据需要动态分配存储空间。,生存期: 静态变量:从程序开始执行到程序结束 动态变量: 从包含该变量定义的函数开始执行至函数执行结束,1、auto变量 存储类别为自动时,声明符auto可省;自动变量被分配在动态区,未赋初值时,其值未定义,每次调用重新赋值。,例如: int f(int a) /*定义f函数,a为形参*/ auto int b,c=3; /*定义b、c为自动变量*/ 又如:auto int b,c=3; int b,c=3; /*两者等价*/,如何区别变量是静态还是动态?,例 auto 变量的作用域,main() int x=

41、1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x); void prt(void) int x=5; printf(“3th x=%dn”,x); ,运行结果: 3th x=5 2nd x=3 1st x=1,2、用static声明局部变量 若希望函数调用结束后,局部变量的值保留,则指定该变量为静态局部变量,用static对变量加以声明。,例 局部静态变量值具有可继承性,main() void increment(void); increment(); increment(); incr

42、ement(); void increment(void) int x=0; x+; printf(“%dn”,x); ,运行结果:1 1 1,main() void increment(void); increment(); increment(); increment(); void increment(void) static int x=0; x+; printf(“%dn”,x); ,运行结果:1 2 3,例 考察静态局部变量的值,#include void main( ) int f(int) ; int a=2, i; for(i=0; i3; i+) printf(“%d ”,

43、 f(a); int f(int a) auto b=0; static c=3; b=b+1; c=c+1; return(a + b + c); ,运行结果:7 8 9,对静态局部变量的说明: 分配在静态区,程序运行结束释放存储单元。 赋初值一次未赋初值时为0,前次结果保留。 局部动态变量若未赋初值,其值不确定,局部静态变量未赋初值,其值为0或0(字符变量)。 静态局部变量在函数调用结束后虽存在,但其它函数不能引用它。,使用局部静态变量的场合 (1)需要保留上一次调用结束时的值,例 打印1到5的阶乘值,#include void main( ) int fac(int n); int i;

44、 for(i=1; i=5; i+) printf(“%d != %dn”, i, fac(i); int fac(int n) static int f=1; f=f*n; return(f); ,(2)初始化后变量只被引用而不改变其值,则用静态局部变量较方便,以免每次调用时重新赋值,但会一直占用内存浪费系统资源。,3、register(寄存器型)变量 CPU内有寄存器可用来存放数据,若把数据声明为寄存器类型,则将该类型的数据存放在寄存器中,其优点是:减少数据与内存之间的交换频率,提高程序的效率和速度。,例 使用寄存器变量,#include void main( ) long fac(lon

45、g); long i, n; scanf(“%ld”, ,运行结果: 1 ! = 1 2 ! = 2 3 ! = 6 4 ! = 24 5 ! = 120,4、用extern声明外部变量 外部变量也称全局变量,在函数外部定义,其作用域是从变量的定义处开始,到本程序文件的未尾。 可以用extern声明外部变量,以扩展外部变量的作用域。,在一个文件内声明外部变量 外部变量没在文件开头定义,其作用域为定义处到文件结束。定义处之前的函数要使用,则在引用前用关键字extern作“外部变量声明”。,例 用extern声明外部变量,扩展作用域,int max(int x, int y) int z; z=x

46、y ? x:y; return(z); main( ) extern int A,B; printf(“%d”,max(A,B); int A=13,B=-8;,可以省略为: extern A,B;,一般应将外部变量定义放在程序最前面,从而省去extern声明,例 用extern扩展作用域,main() void gx(),gy(); extern int X,Y; printf(“1: x=%dty=%dn”,X,Y); Y=246; gx(); gy(); void gx() extern int X,Y; X=135; printf(“2: x=%dty=%dn”,X,Y); int X,Y; void gy() printf(“3: x=%dty=%dn”,X,Y); ,运行结果: 1: x=0 y=0 2: x=135 y=246 3: x=135 y=246,在多文件的程序中声明外部变量 如果一个程序由多个文件组成,而一个外部变量需要在几个文件中引用,此时,可以在任一文件中定义该外部变量,在其它文件中用extern加以声明 若在每个文件中都定义该外部变量,则系统将提示“重定义类型错”,定义,定义,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1