chap7函数省名师优质课赛课获奖课件市赛课一等奖课件_第1页
chap7函数省名师优质课赛课获奖课件市赛课一等奖课件_第2页
chap7函数省名师优质课赛课获奖课件市赛课一等奖课件_第3页
chap7函数省名师优质课赛课获奖课件市赛课一等奖课件_第4页
chap7函数省名师优质课赛课获奖课件市赛课一等奖课件_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

第七章第1页本章关键点函数概念函数定义与调用、申明、返回值,形参和实参变量作用域函数作用域第2页函数概述一个C程序由一个或多个源程序文件组成,一个源程序文件是一个编译单位。而每个源程序文件由一个或多个函数组成,函数是组成C语言程序基本单位。因为C程序执行总是从main函数开始,所以即使是非常简单C语言程序,也最少包含一个函数,即main函数。普通大型C语言程序都由多个函数组成。所以从这个角度来说,编写C语言程序,实质就是编写组成C语言程序各个函数。第3页函数使用为C语言程序带来了许多好处。首先,C语言利用函数实现了程序模块化设计,既满足了结构化程序设计要求,又使得程序设计和维护变得相对较轻易。另首先,因为函数能够重复使用:一个函数不但能够在某个程序中屡次被调用,而且还能够将其用于其它程序中,所以函数有效提升了代码利用率,防止了相同功效代码屡次重复编写,加紧了程序设计开发进程。另外,函数在控制任务规模、控制变量作用范围以及程序开发多人分工协作方面也有许多益处。

能够说C程序全部工作都是由各式各样函数完成,所以也把C语言称为函数式语言。第4页函数分类

1.从函数定义角度看,函数可分为库函数和用户定义函数两种。(1)库函数由C系统提供,用户无须定义,也无须在程序中作类型说明,只需在程序前包含有该函数原型头文件即可在程序中直接调用。在前面各章例题中重复用到printf、scanf、getchar、putchar、gets、puts、strcat等函数均属这类。(2)用户定义函数由用户按需要写函数。对于用户自定义函数,不但要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。第5页2.C语言函数兼有其它语言中函数和过程两种功效,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。(1)有返回值函数这类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。如数学函数即属于这类函数。由用户定义这种要返回函数值函数,必须在函数定义和函数说明中明确返回值类型。(2)无返回值函数这类函数用于完成某项特定处理任务,执行完成后不向调用者返回函数值。这类函数类似于其它语言过程。因为函数无须返回值,用户在定义这类函数时可指定它返回为“空类型”,空类型说明符为“void”。

第6页3.从主调函数和被调函数之间数据传送角度看又可分为无参函数和有参函数两种。(1)无参函数函数定义、函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送。这类函数通惯用来完成一组指定功效,能够返回或不返回函数值。(2)有参函数也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函数调用时,主调函数将把实参值传送给形参,供被调函数使用。第7页6-1函数定义C函数可分为标准库函数和用户定义函数两类。前者是系统定义,它们定义分别放在不一样头文件中,用户只要用#include文件包含将头文件包含到程序中即可调用它们;后者则是用户为处理自己特定问题自行编写。除了标准库函数外,其它全部在C语言程序中用到函数都需要进行定义。C语言函数定义通常由两部分组成:函数头部和函数体。函数定义普通形式为:函数类型函数名(形参表列){申明部分语句部分}函数首部函数体第8页函数定义示例floatsum(floatx,floaty)

{floats;

s=x+y;returns;

}在定义函数时要注意以下几点:

1)函数头部“函数类型”即函数返回值数据类型。假如函数无返回值,则“函数类型”使用空类型(即void类型)表示。假如省略函数返回值类型,并不是意味着函数没有返回值,而是默认函数类型为int型。2)“函数名”必须为有效标识符,即必须遵照C语言标识符命名规则。

3)C语言函数能够没有“形参表列”。假如C语言函数没有“形参表列”则表明函数是无参函数。当“形参表列”中有多个参数时,则它们之间要用逗号(,)分隔。第9页函数定义示例4)函数形参申明形式与变量定义形式不一样。假如要定义两个整型变量x和y,我们能够写成以下形式:intx,y;而假如是形参,则只能是(intx,inty)5)C语言中允许定义空函数。比如:voiddummy(void){}在程序中调用此函数时,实际上什么工作也不做,没有任何实际作用。6)在C语言中,全部函数定义,包含主函数main在内,都是平行。也就是说,在一个函数函数体内,不能再定义另一个函数,即不能嵌套定义。

intmax(int

x,inty){

intz;z=x>y?x:y;

return

z;

}第10页6-2函数调用函数功效真正起作用是在函数被调用时。所谓“函数调用”,就是将实参值传给形参后,计算机系统控制流程便转移去执行被调函数操作,得到结果后又返回到调用环境中.C语言函数调用普通形式为:

函数名(实参表列);1.假如是调用无参函数,则“实参表列”能够没有,但括弧不能省略。2.假如实参表列包含多个实参,则各参数间用逗号隔开。实参与形参个数应相等,类型应匹配。实参加形参按次序对应,向形参传递数据。第11页函数调用方式1.函数语句把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定操作。scanf(“%d”,&x);printf("x=%d\n",x);2.函数表示式(最惯用)函数出现在一个表示式中,这种表示式称为函数表示式。这时要求函数带回一个确定值以参加表示式运算。比如:c=2*max(a,b);y=sqrt(x);按函数在程序中出现位置来分,能够有以下三种函数调用方式:

第12页例

函数调用简单例子#include<stdio.h>void

print_message()

/*定义print_message函数*/{

printf("****************\n");printf("Howdoyoudo!\n");

printf("****************\n");}voidmain(){print_message();/*调用print_message函数*/}运行情况以下:****************Howdoyoudo!****************第13页3.函数参数(不惯用)函数调用作为一个函数实参。

比如:m=max(a,max(b,c));其中max(b,c)是一次函数调用,它值作为max另一次调用实参。m值是a、b、c三者中最大者。比如:

intmax(intx,inty){

intz;

z=x>y?x∶y;return(z);}

第14页调用特殊形式C语言允许在一个函数定义中出现对另一个函数调用。这么就出现了函数嵌套调用。即在被调函数中又调用其它函数.long

f2(intq){……}long

f1(intp){……r=f2(k);……}main(){……s=s+f1(i);……C语言函数还能够递归调用,即函数自己调用自己long

jiecheng(intn){

if(n==0||n==1)return1;

else

return

jiecheng(n-1)*n;}voidmain(){intn;longy;printf("\ninputainteagernumber:\n");scanf("%d",&n);y=jiecheng(n);printf("%d!=%ld",n,y);}第15页6-3函数申明假如函数先定义,后调用,则可不用进行申明。假如函数调用发生在函数定义前面,应在函数调用前对函数进行申明。函数申明普通形式为:

函数类型函数名(形参说明表);//就是函数头部加分号

假如需要对函数进行申明,函数申明位置普通在:①调用语句所在函数函数体前。这种申明仅对该函数有效。②全部函数定义之前。这种申明对本文件中全部函数都有效。第16页函数申明举例float

f(floatb);voidmain(){……}float

f(floatb){……}第17页例对被调用函数作申明#include<stdio.h>voidmain(){

floatadd(float

x,float

y);/*对被调用函数add申明*/float

a,b,c;scanf("%f,%f",&a,&b);c=add(a,b);

/*函数语句调用形式*/printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函数首部*/{floatz;/*函数体*/z=x+y;return(z);}运行情况以下:3.6,6.5↙

Sumis10.100000第18页例

#include<stdio.h>floatadd(floatx,floaty)/*函数首部*/{floatz;z=x+y;return(z);}voidmain(){/*无须再对add函数作申明*/ floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}第19页6-4函数形参和实参函数定义和调用过程会包括到函数参数:形式参数和实在参数。形式参数和实在参数分别简称为形参和实参。形参是指在定义函数时函数名后面括号中参数。实参则是指在主调函数中调用一个函数时,函数名后面括号中参数。第20页形参和实参注意事项

1)形参必须是单个变量名(普通变量名、指针变量名、一维数组、二维数组),而实参能够是常量、变量或表示式,而且实参在函数调用发生前必须有确定值。

比如:z=max(3,a+b);在调用时将实参值赋给形参。2)在定义函数时,假如有形参,则形参必须指定数据类型。形参类型申明放在函数名后括号中;假如函数没有形参,那么形参列表部分为空(旧标准),或者形参列表部分写上void。3)在函数调用发生之前,形参并不占用内存中存放单元。只有当函数调用时,实参值传递(拷贝)给形参时,形参才被分配内存存放单元,而且形参所占内存单元在函数调用结束后马上被释放。

4)在C语言中,实参向形参数据传递是“单向传递”。因为C语言实参加形参占用不一样内存单元,在函数调用发生瞬间实参把自己值传递给形参,然后形参和实参就分别代表不一样内存单元而不再有什么联络。所以形参不会把值回传给实参。

第21页形参和实参5)假如形参是数组名,则实参也必须对应为适当数组名或指针,而且实参传递给形参也不再是数组中元素值,而是数组首地址。6)实参加形参个数必须相同,次序一致,而且实参加对应形参类型应相同或赋值兼容。7)因为实参和形参占用不一样内存单元,所以即使形参和实参同名,它们也互不影响。第22页6-5函数返回值在调用函数过程中,经常希望得到一个从被调用函数中带回来值,这就是函数返回值。在值传递方式下,因为形参不能将函数调用后改变了数据传回给实参,所以C语言专门设置return控制语句来完成被调函数向主调函数数据回传。第23页说明:

1.函数返回值是经过函数中return语句取得。三种格式:return(表示式);return表示式;return;return语句后面括弧也能够不要比如:

“returnz;”等价于“return(z);”return后面值能够是一个表示式。比如:

max(intx,inty){

return(x>y?x:y);

}第24页2.函数返回值应该属于某一个确定类型,在定义函数时指定函数返回值类型。比如:下面是3个函数首行:int

max(floatx,floaty)/*函数值为整型*/char

letter(charc1,charc2)/*函数值为字符型*/

double

min(intx,inty)/*函数值为双精度型

*/

注意:凡不加类型说明函数,自动按整型处理。第25页3.在定义函数时指定函数类型普通应该和return语句中表示式类型一致。假如函数值类型和return语句中表示式值不一致,则以函数类型为准。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。4.对于不带回值函数,应该用“void”定义函数为“无类型”(或称“空类型”)。此时在函数体中不得出现return语句。

5.一个函数中能够有一个以上return语句,执行到哪一个return语句,哪一个语句起作用。第26页注意是,在函数定义中可能有不止一个return语句,但每次调用函数时,至多只能执行其中一个return语句,而并不会有多个return语句都得到执行。函数每次调用返回最多只能带回一个值。第27页函数举例

#include<stdio.h>doublefun(intn){doubles=1;inti;for(i=1;i<=n;i++)s*=i;return(s);}voidmain(){doulblec;inta;scanf("%d",&a);c=fun(a);printf(“c=%f\n",c);}运行情况以下:4↙

c=24

第28页参考:#include<stdio.h>intfun(intx,inty){ints=1,i;for(i=1;i<=y;i++)s*=x;returns;}voidmain(){inta,b,c;printf("请输入2个整数\n");scanf(“%d%d”,&a,&b);c=fun(a,b);printf("%d%d=%d\n”,a,b,c);}第29页#include<stdio.h>floatmax(floata,floatb){

if(a>b)returna;elsereturnb;}voidmain(){float

x=10,y=15,z;z=max(x,y);printf(“z=%f\n”,z);}函数首部函数体函数调用语句第30页思索:用函数实现任意2个整数xy,在主函数中实现x,y输入,函数调用和结果输出.intfun(intx,inty){}编写函数实现判断任意一个整数是(1)否(0)为素数.intisprime(intx){}

第31页参考:#include<stdio.h>intisprime(intx){}voidmain(){inta,b;scanf(“%d”,&a);b=isprime(a);if(b==1)printf(“%d是素数\n”,a);if(b==0)printf(“%d不是素数\n”,a);}inti,flag;flag=1;for(i=2;i<x;i++)if(x%i==0)flag=0;returnflag;第32页1、编写一个函数fun,其功效是:计算m!。比如,给m输入3,则输出6.000000。#include<stdio.h>doublefun(intm){

}main(){intm;printf("请输入m值:");scanf("%d",&m);printf("m!=%f\n",fun(m));}2、请依据主程序中函数调用情况,写一个成绩函数chargrade(floatx),对于给定一个百分制成绩x,要求返回其对应等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~90分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’D’。#include<stdio.h>chargrade(floatx){}voidmain(){floatx;charch;scanf("%f",&x);ch=grade(x);printf("成绩等级=%c\n",ch);}第33页6-6函数参数传递机制

——参数--值传递--举例形参N被调函数:主调函数:38实参D=max(8,3)

83intmax(intX,intN)X第34页例#include<stdio.h>voidSwap(inta,intb){ intt; t=a; a=b; b=t;}voidmain(){ intx=5,y=10; printf(“x=%d,y=%d\n”,x,y); Swap(x,y); printf(“x=%d,y=%d\n”,x,y); }运行结果: x=5y=10 x=5y=10第35页a=b;5x10y5a10b执行主函数中函数调用Swap(x,y);t=a;5x10y5a10b5tb=t;5x10y10a5b5t5x10y10a10b5t在Swap子函数中返回主函数以后5x10y3636第36页函数参数传递

——用地址做形参:后面章节详细介绍在c语言中,当形参为数组名或指针变量时,均采取地址传递。voidswap(int*a,int*b){...}第37页例输入两个整数交换后输出#include<stdio.h>voidSwap(int*a,int*b);intmain(){ intx=5,y=10; printf(“x=%d,y=%d\n”,x,y); Swap(&x,&y); printf(“x=%d,y=%d\n”,x,y);}voidSwap(int*a,int*b){ intt; t=*a; *a=*b; *b=t;}运行结果:x=5y=10x=10y=5第38页t=*a;x5t5x地址axy510y

地址x地址aby地址x地址abx10y10*a=*b*b=t;y5t5y地址bxy105Swap(&x,&y);39第39页6-6数组作为函数参数6-6.1数组元素作函数实参

因为实参能够是表示式,而数组元素能够是表示式组成部分,所以数组元素能够作为函数实参,与用变量作实参一样,是单向传递,即“值传送”方式。第40页例6-10

有两个数组a和b,各有10个元素,将它们对应地逐一相比(即a[0]与b[0]比,a[1]与b[1]比……),分别统计出两个数组对应元素大于、等于、小于次数。第41页#include<stdio.h>intfun(intx,inty){intflag=0;if(x>y)flag=1;if(x<y)flag=-1;return(flag);}voidmain(){inta[10]={1,2,6,8,0,-1,4,5,9,7};intb[10]={0,1,3,7,-4,-1,9,5,2,9};inti,n=0,m=0,k=0;for(i=0;i<10;i++){if(fun(a[i],b[i])==1)n=n+1;if(fun(a[i],b[i])==0)m=m+1;if(fun(a[i],b[i])==-1)k=k+1;}printf(“大于=%d,相等=%d,小于=%d\n",n,m,k);}第42页6-6数组作为函数参数6-6.2数组名作函数参数

能够用数组名作函数参数,此时形参应该用数组名或用指针变量。例6-11有一个一维数组score,内放10个学生成绩,请用函数实现求平均成绩返回,并在主函数中实现调用。第43页#include<stdio.h>#defineN10floataverage(floatarray[],intn){inti;floataver,sum=0;for(i=0;i<n;i++)sum=sum+array[i];

aver

=sum/n;return(aver);}voidmain(){floatscore[N],aver;inti;printf(″input10scores:\n″);for(i=0;i<N;i++)scanf(″%f″,&score[i]);

aver=average(score,N);printf(″averagescoreis%5.2f\n″,aver);}经常采取此形式:数组申明和长度申明实参:数组名和长度第44页例6-12编写一个函数,用来分别求数组s1和数组s2各元素平均值。

#include<stdio.h>floataverage(floatarray[],intn){inti;floataver,sum=0;for(i=0;i<n;i++)sum=sum+array[i];aver=sum/n;returnaver

;}voidmain(){floats1[5]={98.5,97,91.5,60,55};floats2[10]={66-5,89.5,99,60.5,77,89.5,65,54,60,82};printf(“平均s1=%6.2f\n”,average(s1,5));printf(“平均s2

=%6.2f\n”,average(s2,10));}第45页例6-13用选择法对数组中10个整数按由小到大排序。所谓选择法就是先将10个数中最小数与a[0]对换;再将a[1]到a[9]中最小数与a[1]对换……每比较一轮,找出一个未经排序数中最小一个。共比较9轮。第46页未排序时情况:a[0]a[1]a[2]a[3]a[4]36194将5个数中最小数1与a[0]对换:16394将余下4个数中最小数3与a[1]对换13694将余下3个数中最小数4与a[2]对换13496将余下2个数中最小数6与a[3]对换,至此完成排序13469第47页程序实例#include<stdio.h>voidsort(intarray[],intn){inti,j,min,t;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++)if(array[j]<array[min])min=j;t=array[min];array[min]=array[i];array[i]=t;}}第48页voidmain(){inta[10]={3,6,1,9,4,2,5,7,0,10},i;printf(″数组原始数据是∶\n″);

for(i=0;i<10;i++)printf(″%4d″,a[i]);printf(”\n”);sort(a,10);

printf(″排序后数组数据是∶\n″);for(i=0;i<10;i++)printf(″%4d″,a[i]);printf(”\n”);}

运行结果以下:数组原始数据是∶36194257010

排序后数组数据是∶01234567910第49页6-6数组作为函数参数6-6.3用多维数组名作函数参数多维数组元素能够作函数参数,这点与用一维数组元素作函数参数情况类似。

也能够用多维数组名作为函数实参和形参,在被调用函数中对形参数组定义时能够指定每一维大小,也能够省略第一维大小说明。第50页例6-14有一个3×4二维数组,设计一个函数,用来求二维数组中全部元素中最大值。

算法:先使变量max初值为二维数组中第一个元素值,然后将二维数组中各个元素值与max相比,每次比较后每次比较后都把“大者”存放在max中,全部元素比较完后,max值就是全部元素最大值。第51页#include<stdio.h>intfun(intarray[][4]){inti,j,max;

max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);}

voidmain(){int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}},m;m=fun(a);printf(“最大值是%d\n”,m);}

运行结果以下:Maxvalueis34能够省略一维大小,第52页思索编程:

1、已经有变量定义和函数调用语句:intx=57;isprime(x);函数isprime()用来判断一个整形数a是否为素数,若是素数,函数返回1,不然返回0。请编写isprime函数。isprime(inta){}2、a是一个2X4整型数组,且各元素均已赋值。函数max_value可求出其中最大元素值max,并将此值返回主调函数。今有函数调用语句max=max_value(a),请编写max_value函数。max_value(intarr[][4]){}3、编写一个交换变量值函数,利用该函数交换数组a和数组b中对应元素值。4、从键盘任意输入10个整数,用函数编程实现计算最大值和最小值,并返回它们所在数组中位置。第53页5、不用函数strcat(),编程实现字符串连接函数strcat()功效,将字符串srcStr连接到字符串dstStr尾部。6、编程实现从键盘输入一个字符串,将其字符次序颠倒后重新存放,并输出这个字符串。7、编程判断输入一串字符是否为“回文”。所谓“回文”,是指顺读和倒读都一样字符串。如"level","ABCCBA"都是回文。第54页1、编写函数reverse(),其功效是将a所指数组中内容进行逆置存放。voidreverse(inta[],intn){}voidmain(){intb[10]={1,2,3,4,5,6,7,8,9,10};inti,s=0;reverse(b,10);for(i=0;i<10;i++)printf("%d\n",b[i]);}2、编写一函数sort,可实现对某数组中n个数由小到大排序,在主函数中已定义一个含有10个元素整数数组a,接收从键盘输入10个整数,调用函数sort实现排序,并输出排序结果。#include<stdio.h>voidsort(intarray[],intn){

}voidmain(){inta[10],i;printf("Enterthearray\n");for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);printf("Thesortedarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}第55页3、编写函数判断输入一串字符是否为“回文”。所谓“回文”,是指顺读和倒读都一样字符串。如"level","ABCCBA"都是回文。

请勿改动主程序main与其它函数中内容,仅在函数huiwen花括号中填入所编写若干语句。注意:部分源程序给出以下:#include<stdio.h>#include<string.h>inthuiwen(charx[]){

}voidmain(){ charstr[80]; gets(str);if(huiwen(str)) printf("%sishuiwen",str);

else printf("%sisnothuiwen",str);}第56页6-7变量作用域--局部变量和全局变量6-6-1局部变量

在一个函数内部定义变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量。这称为“局部变量”。

作用范围从定义位置开始到本函数结束位置。第57页主函数中定义变量只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其它函数中定义变量。不一样函数中能够使用相同名字变量,它们代表不一样对象,互不干扰。形式参数也是局部变量。第58页floatf1(inta)/*函数f1*/{intb,c;…a、b、c有效}charf2(intx,inty)/*函数f2*/{inti,j;…

x、y、i、j有效}voidmain()/*主函数*/{intm,n;…m、n有效}

第59页6-7变量作用域--局部变量和全局变量6-6-2全局变量在函数内定义变量是局部变量,而在函数之外定义变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量能够为本文件中其它函数所共用。它有效范围为从定义变量位置开始到根源文件结束。第60页intp=1,q=5;/*外部变量*/floatf1(inta)/*定义函数f1*/{intb,c;…}charc1,c2;/*外部变量*/charf2(intx,inty)/*定义函数f2*/{inti,j;全局变量p,q作用范围…全局变量c1,c2作用范围}voidmain()/*主函数*/{intm,n;…}第61页提议不在必要时不要使用全局变量,原因以下:①全局变量在程序全部执行过程中都占用存放单元,而不是仅在需要时才开辟单元。②使用全局变量过多,会降低程序清楚性。在各个函数执行时都可能改变外部变量值,程序轻易犯错。所以,要限制使用全局变量。③它降低函数通用性,因为函数在执行时要依赖于其所在外部变量。第62页例6-16外部变量与局部变量同名#include<stdio.h>inta=3,b=5;

/*a,b为外部变量*/max(inta,intb)

/*a,b为局部变量*/

{intc;c=a>b?a∶b;return(c);

}voidmain(){int

a=8;

/*a为局部变量*/printf(″%d″,max(a,b));//全局变量b作用范围}运行结果为8

在全局变量作用范围内,有与其同名局部变量,则全局变量不起作用(隐蔽).

第63页

6-8变量存放方式和生存期

1、从变量作用域(即从空间)角度来分,能够分为全局变量和局部变量。2、从变量值生存期(即存在时间)角度来分,又能够分为静态存放方式和动态存放方式(默认方式)。存放类型说明有4中:auto(默认类型)、register、static、extern。第64页

6-8变量存放方式和生存期

1、

所谓静态存放方式是指在程序运行期间由系统分配固定存放空间方式。

2、动态存放方式则是在程序运行期间依据需要进行动态分配存放空间方式。在C语言中每一个变量和函数有两个属性:数据类型和数据存放类别。第65页静态变量在变量定义时,就分配存放单元,该单元一直保持不变,直到整个程序结束。作用域:在定义此变量函数内。形式:static数据类型变量名列表;staticintx,y;1.对静态变量是在编译时赋初值,即只赋初值一次,在程序运行时它有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时值。2.如在定义静态变量时不赋初值话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(‘\0’)(对字符变量)。3.形参不能定义成静态变量.第66页例6-17考查静态变量值#include<stdio.h>int

f(inta){autoint

b=0;staticintc=3;b=b+1;c=c+1;

return(a+b+c);}voidmain(){inta=2,i;

for(i=0;i<3;i++)printf(″%d″,f(a));}程序运行结果以下:7

温馨提示

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

评论

0/150

提交评论