版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章函数程序运行后的输出为****************************************Howareyou****************************************main(){}
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);
printf(“Howareyou?”);main(){star();star();
Printmessage();star();
star();}
star(){printf(“*********************”);
}printmessage(){printf(“Howareyou?”);
}
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);}
printf(“Howareyou?”);从上例程中不难看出:(1)函数分为标准函数和自定义函数.例如:函数标准函数自定义函数scanf()printf()sqrt(x)sin(x)Printmessage()star()(2)程序的执行从main()函数开始,调用其他函数后又返回到main()函数,在main()函数中结束程序的运行.标准函数:是系统定义好的函数,我们可以直接从函数库中取出来调用。如:“stadio.h”,“math.h”库自定义函数:是程序设计者为满足自己的实际需要而自己定义的特殊功能的函数
8.2函数的定义变量定义输入语句算法的描述输出语句main(){}求两个数中的最大值inta,b,c;Scanf(“,%d,%d”,&a,&b);变量定义输入语句算法的描述输出语句C=max(a,b);printf(“max=%d”,c);类型函数名(形参表)参数定义;{}inta,b;intz;if(a>b)z=a;elsez=b;return(z);求三个数中的最大值inta,b,c,d,x;Scanf(“%d,%d,%d”,&a,&b,&c);x=max(a,b);d=max(x,c);printf(“max=%d”,d);intmaxa,b形式参数实际参数main(){print();
}类型函数名(参数列表)参数定义;{
}变量定义输入语句算法的描述输出语句intn,i,j;
for(i=1;i<=n;i++){printf("%*c",40-2*(i-1),'');
for(j=1;j<=2*i-1;j++)
printf("%-2c",'*');
printf("\n");}
printscanf(“%d”,&n);当我们只执行某个操作而不需要传递数据时可以定义无参函数。如:打印三角形函数的定义从形式上可分为:定义的一般形式:类型说明符函数名(){
说明部分执行部分
}定义的一般形式:类型说明符函数名(形式参数表列)形式参数说明部分{
说明部分
执行部分}无形式参数函数的定义有形式参数函数的定义算法输出部分算法输出部分8.4函数的调用函数调用的一般形式:函数名(实际参数表列);调用无参函数,则实参表列可以没有,但括弧不能省略。说明:调用有参函数,则实参表列各参数间用逗号间隔。实参与形参个数应相等,类型应一致,顺序一一对应。函数调用一般有以下三种方式:自定义函数的调用方式和标准函数的调用方式是一样的。唯一的区别就是谁编写的这个函数。标准函数的调用:x=sqrt(2*8);printf(“***”);等函数的调用方式:1、函数语句。(把函数调用作为一个语句)
标准函数
自定义函数
printf(“请用心听讲”);
star();2、函数出现在一个表达式中。
标准函数
自定义函数
s=pow(x,y);
c=2*max(a,b);3、函数调用作为一个函数的参数。
标准函数
自定义函数
m=sqrt(pow(x,3));
m=max(a,max(b,c));
main(){inta,b,c,s;do{printf(“Enterthreemuber,end
markis000\n”);
scanf(“%d%d%d”,&a,&b,&c);s=sum(a,b,c);
printf(“sum=%d\n”,s);}while(!(a==0&&b==0&c==0));}intsum(x,y,z)intx,y,z;{intm;m=x+y+z;return(m);}float
%f%f%f”%f
float
float
,sum();
例当用户从键盘输入三个整数时,计算机显示出这三个数之和。若三数均为零,则程序结束。注意:实参与形参个数应相等,类型应一致,顺序一一对应。实参形参float
main(){intm,n;longt,fac();
printf("Pleaseinputm,n(m>n):");
scanf("%d%d",&m,&n);t=fac(m)/(fac(n)*fac(m-n));printf("c(n,m)=%ld/(%ld*%ld)=%ld",fac(m),fac(n),fac(m-n),t);}longfac(n)
intn;{inti;longf=1;for(i=1;i<=n;i++)f=f*i;return(f);}输入:87;m=8,n=7;t=fac(8)/(fac(7)*fac(1));
8840320775040Fac(7)Fac(8)403205040Fac(1)1111输出:c(n,m)=40320/(5040*1)=8思考:编写程序计算函数的类型一、函数的类型说明函数的类型是指函数返回值的类型.定义函数时是放在函数名之前.当类型为char或int时,可以缺省函数的类型说明floatf1(x)floatx;…{…}doublef2(x)doubley;{…}voidf3(x)doublex;{…}longf4(x)intx;{…}intf5(x)intx;{…}函数的类型说明可缺省的函数类型说明是
int
或charcharf6(x)intx;{…}float
double
void
long
int
char
•在主调函数的函数体内要对被调函数的类型进行说明floatf1(x,y)floatx;
inty;{…}main(){floatf1();floatf2();
int
f3();…}floatf2(x)doublex;{…}在主调函数体内说明被调函数的类型int
f3(x)intx;{…}定义在前,调用在后,可缺省对被调函数的类型说明类型为char或int时,可缺省对被调函数的类型说明float
f1();float
f2();intf3();
•当被调函数定义在前,主调函数定义在后,在主调函数内可缺省对被调函数的类型说明•当说明函数的类型为char或int时,在主调函数内可缺省对被调函数的类型说明6.3.2返回语句返回语句可以有.例如:返回语句中的表达式类型与函数的类型说明不一致时,以函数的类型说明为准.例如:intf1(x)intx;{
inty;y=++x;
returny;}返回语句也可以无.例如:voidf1(x)intx;{
inty;y=++x;...}返回语句可以有表达式.例如:intf1(x)intx;{
inty;y=++x;
return++x;}intf1(x)floatx;{floaty;y=++x;
returny;}回传类型为int格式:return(表达式);
return表达式;8.3函数参数和函数的值一、形式参数与实际参数在大多情况下的函数调用,主调函数和被调函数之间有数据传递关系.定义函数时的参数称为形式参数(或“形参”),调用函数时的参数称为实在参数(或“实参”).例如:数据传送方式:传值int
zs(x)
intx;{inti,k=1;for(i=2;i<x;i++)if(a%i==0)k=0;return(k);}main(){inta,i;for(a=3,i=1;i<=10;a++)if(zs(a)&&zs(a+2)){printf("%dand%d\n",a,a+2);i++;}}实参形参形参类型说明函数返回值类型说明
变量作为函数参数时数据传递是单向值传递,形参与实参分别占据不同的内存单元。形参
x实参a33调用zs(a)结果1形参
x实参a+255调用zs(a+2)结果1传值调用中,实际参数可以是:
变量、表达式、常数、函数还有数组元素。如:zs(a),zs(a+2)sqrt(16)max(a,max(a,b)),zs(a[2])二、形式参数与实际参数的结合下面,通过求三个数最大值的程序,讨论形参与实参数的结合.main(){inta,b,c,f;a=4,b=3,c=5;f=max(max(a,b),c);
printf(“max=%d\n”,f);}max(a,b)inta,b;{intf;if(a>b)f=a;elsef=b;returnf;}a=4,b=3,c=5;max(a,b)max(4,3)a=4,b=3;4>3f=4;回传
4后结束
.max(a,b)inta,b;{intf;if(a>b)f=a;elsef=b;returnf;}4max(4,c);a=4,b=5;4>5f=5;max(4,5)回传5后结束.
5;max(a,b)inta,b;{intf;if(a>b)f=a;elsef=b;returnf;}输出:max=5f=5;形式参数与实际参数的结合实际上是将实参的值赋给形参然后又用函数来完成规定的处理,并回送结果至主调程序。三、数组作为函数参数(1)数组元素作为函数参数数组元素作为函数参数时,效果与简单变量相似,是实际参数向形式参数单向顺序地值传递。设有两个数组a和b,各有10个元素.求这两数组对应元素之和(例如:a[i]+b[i]),并分别统计其和大于0、小于0、等于0的个数main(){inta[10],b[10],L=0,S=0,E=0,i,f;for(i=0;i<10;i++)scanf(“%d”,&a[i]);for(i=0;i<10;i++)scanf(“%d”,&b[i]);for(i=0;i<10;i++){f=sum(a[i],b[i]);if(f==1)L++;elseif(f==0)E++;elseS++;}
printf(“L=%d,E=%d,S=%d\n”,L,E,S);}sum(x,y)intx,y;{
intf;if(x+y>0)f=1;elseif(x+y==0)f=0elsef=-1;return(f);}i=0,a[0]=1i=1,a[1]=2i=2,a[2]=3i=3333i=0,b[0]=0i=1,b[1]=-2i=2,b[2]=-4i=3i=0,sum(1,0),f=1,f=f=1,L++i=1,sum(2,-2),f=0,f=f=0,E++i=2,sum(3,-4),f=-1,f=f=-1,S++i=3b[i]=-2*i;a[i]=i+1;(2)数组名作为函数实参数组名作为函数参数时,形参与实参都表示的是地址参数.实参向形参传递地址.变量作为函数参数时数据传递是单向值传递,形参与实参分别占据不同的内存单元。形参
x实参a3
3形参数组
x实参数组a2001
2001传送地址的实质是使主调函数和被调函数在同一的内存单元上进行数据操作.a[1]ff10a[0]a[2]a[3]a[4]ff10/&a[0ff18/&a[2]ff1c/&a[3]ff20/&a[4]floataverage(a)floata[5];{intk;floats=a[0];for(k=1;k<5;k++)s=s+a[k];s=s/5;returns;}main(){floatn[5],f;inti;for(i=0;i<5;i++)
scanf(“%f”,&n[i]);f=average(n);
printf(“average=%g\n”,f);}ff10n[0]
n[1]
n[2]
n[3]
n[4]n62108
a
for(i=0;i<5;i++)
scanf(“%f”,&n[i]);f=average(n);floataverage(a)floata[5];fi012345k=intk;floats=a[0];
4s=for(k=1;k<5;k++)s=s+a[k];
1
10
2
12
3
22
4
30
5
6s=6;
f=average(n);
4returns;
printf(“average=%g\n”,f);6ff14/&a[1]ff14/&a[1]例、从键盘输入5个数,求其平均值.下面的例题也是主调函数与被调函数在相同的地址单元上对数据进行操作.通过对sort()函数的定义和main()函数对sort()函数的调用,完成一维数组的排序.main(){intx[5],i;for(i=0;i<5;i++)
scanf(“%d”,&x[i]);sort(x);for(i=0;i<5;i++)printf(“%8d”,&x[i]);}voidsort(a)inta[5];{inti,j,t;for(i=0;i<4;i++)for(j=i+1;j<5;j++)if(a[i]<a[j])t=a[i],a[i]=a[j],a[j]=t;}axX[0]xX[1]xX[2]xX[3]xX[4]x……x为了提高自定义函数的通用性,在定义函数时,可用变量表示形参是一维数组的尺寸.也就是可用两个形参来说明一维数组,一个表示首地址;一个表示元素个数.下面的程序是求数组中最大值的例题:main(){staticinta[5]={1,6,4,9,3};staticintb[6]={3,1,6,8,4,7};printf(“max=%d\n”,max(a,5));printf(“max=%d\n”,max(b,6));}intmax(x,n)intx[],n;{inti,t=x[0];for(i=1;i<n;i++)if(t<x[i])t=x[i];returnt;}在第一调用时,max(a,5),使x=a地址相同
,n=5元数个数为5,返回值为9.在第一调用时,max(b,6),使x=b地址相同,n=6元数个数为6,返回值为8.(3)、用多维数组作为函数的参数1、多维数组元素可以作为实参和形参,可当作一个变量2、多维数组名作为实参和形参,就是传地址,与一维数组类似。在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明.如:intarray[3][10];
或intarray[][10];
都合法实参数组可以大于形参数组。实参数定义为intarray[5][10];形参数组定义为intarray[3][10];
max_value(array)
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);}main(){staticinta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf("maxvalueis%d\n",max_value(a));}例、有一个3*4的矩阵,求其中的最大元素。8.5函数的嵌套调用
C语言的函数定义都是互相平行、独立的,即在定义函数时,一个函数内不能包含另一个函数的完整定义,也就是C语言不能嵌套定义函数.但是C语言允许嵌套调用函数.唯有主函数main()不可被其他函数调用.main(){floata,b,c,m,max();scanf(“%f%f%f”,&a&b,&c);m=max(a,b,c);printf(“max=%f\n”,m);}floatmax(a,b,c)floata,b,c;{floatt1,t2,func();t1=func(a,b);t2=func(t1,c);returnt2;}floatfunc(a,b)floata,b;{returna>b?a:b;}定义变量说明函数下面是函数的嵌套调用,求三个数中最大值的程序:下面是函数的嵌套调用,求三个数中最大值的流程示意图:main()max(a,b,c)func(a,b)func(t1,c)给a,b,c输入数据输出最大值mm=t1=t2=返回较大值返回较大值返回t2值结束运行main(){floata,b,c,m,max();scanf(“%f%f%f”,&a&b,&c);m=max(a,b,c);printf(“max=%f\n”,m);}floatmax(a,b,c)floata,b,c;{floatt1,t2,func();t1=func(a,b);t2=func(t1,c);returnt2;}floatfunc(a,b)floata,b;{returna>b?a:b;}8.6函数的递归调用
C语言的函数可以直接或间接调用函数自身,我们称这种调用为函数的递归调用.下面是用递归函数求n!的例题:定义函数fact()与自变量n的函数关系为:n!=(n-1)!*n1n>1n=1fact(n)/*定义fact()函数*/intn;{intf;if(n==1)f=1;elsef=fact(n-1)*n;returnf;}main()/*定义main()函数*/{intn;n=fact(4);printf(“4!=%d\n”,n);}该程序的执行步骤如下:main()fact(4)fact(3)
4fact(2)
3fact(1)
2n=f=f=f=f=112f=2f=66f=24n=24输出4!=24结束运行fact(n)/*定义fact()函数*/intn;{intf;if(n==1)f=1;elsef=fact(n-1)*n;returnf;}例:用递归求m,n中的最大公约数(m>n)。
辗转相除法
r=m%n;m=n;n=r;请把递归公式描述出来gcd(m,n)=ngcd(n,m%n),m%n==0m%n!=0main(){intm,n;
printf("inputtwonuber(m>n)");
scanf("%d%d",&m,&n);
printf("\t%d\n",gcd(m,n));}int
gcd(int
m,intn){if(n==0)returnm;elsereturngcd(n,m%n);}main()输入12,8printf("%d",gcd(12,8));gcd(12,8){n!=0returngcd(8,12%8);}gcd(8,4){n!=0returngcd(4,0)}main()输入12,8printf("%d",4);gcd(12,8){n!=0return4}gcd(8,4){n!=0return4}gcd(4,0){n==0returnm=4}例:(Hanoi)汉诺塔问题(见课本161页)ABC模拟这一过程的算法称为:hanoi(n,a,b,c);那么:第一步:先把n-1个盘子设法借C杆移到B杆,记做:hanoi(n-1,a,c,b);第二步:把第n个盘子从A杆移到C杆。(可用自然语言表示出来)第三步:把B杆上的n-1个盘子借助A杆移到C杆,记做
hanoi(n-1,b,a,c)voidhanoi(intn,chara,charb,charc){if(n>0){hanoi(n-1,a,c,b);
printf("\tmove%dfrom%cto%c\n",n,a,c);hanoi(n-1,b,a,c);}}#include"conio.h"main(){intn;
clrscr();
printf("\tPleaseinputthenumberofdisk:");
scanf("%d",&n);
hanoi(n,'a','b','c');}归纳递归的基本思想如下:1、将后一项表示成前一项的表达式式子。(找出后一项与前一项之间的关系)如:n!=(n-1)!*n2、还要有一个能使递归结束返回的条件,如:n!=1(n=1)试写出用递归求xnxn=xn-1
x1n>=0n=01.完成下面的程序,使它能输出10~1000之间的所有素数.#include<stdio.h>main(){inti;for(i=10;i<=1000;i++)if(isprime(________))
printf(“%d”,i);printf(“\n”);}#include________isprime(n)intn;{inti;for(i=2;i<=sqrt(n);i++)if(n%i==0)
return(________);return(________);}i<math.h>012.
函数tryme调用时若输入ABCDE$,则输出为____voidtryme(void){charch;
if((ch=getchar())!=’$’){putchar(ch);
tryme();}}
Aputchar(ch);Atryme();voidtryme(void)Bputchar(ch);ABtryme();ABCDE‘$’}(11)#include“stdio.h”main(){printf(“\nfact(5):%d”,fact(5));printf(“\nfact(1):%d”,fact(1));fact(-4);}fact(n);intn;{if(n<0){printf(“\nERROR!”);return(-1);}elseif(n==1)||(n==0)return1;elsereturn(n*fact(n-1));}fact(5)5120输出:fact(5):120fact(1)11fact(5):120fact(1):1fact(-4);-4(-4<0)printf(“\nERROR!”);fact(5):120fact(1):1ERROR!return(-1);}-1receive(){charch;
scanf(%c”,&ch);
printf(“%c”,ch);if(ch!=‘.’)receive();
printf(“%c”,ch);}main(){receive();}输入:god.输出:ch=‘g’printf(“%c”,ch);gif(ch!=‘.’)receive();receive()ch=‘o’printf(“%c”,ch);goif(ch!=‘.’)receive();godreceive()ch=‘.’printf(“%c”,ch);if(ch!=‘.’)receive();god.printf(“%c”,ch);ch=‘g’printf(“%c”,ch);receive()printf(“%c”,ch);ch=‘o’printf(“%c”,ch);receive()printf(“%c”,ch);ch=‘d’printf(“%c”,ch);receive()printf(“%c”,ch);ch=‘.’printf(“%c”,ch);if(ch!=‘.’)…printf(“%c”,ch);god..god..dgod..dogod..dog上机作业:1、定义一函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。例如:
digit(15327,4)=5digit(289,5)=0
请编出完整的程序。2、定义一个函数check(n,d),它回送一个布尔值。如果数字d在整数n的某位中出现,则回送1,否则回送0。假如:
check(3256,2)=1check(1725,3)=0
编出完整的程序。3、P186、8.4上机作业:1、定义一函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。例如:
digit(15327,4)=5digit(289,5)=0
请编出完整的程序。2、定义一个函数check(n,d),它回送一个布尔值。如果数字d在整数n的某位中出现,则回送1,否则回送0。假如:
check(3256,2)=1check(1725,3)=0
编出完整的程序。for(i=1;i<=k-1;i++)n=n/10;d=n%10;n=n/(int)pow(10,k-1);d=n%10;for(i=0;n!=0;i++){x=n%10;n=n/10;if(x==n){bool=1;break;}}8.8局部变量与全局变量一、局部变量在函数内部定义的变量称为局部变量局部变量仅能由定义该变量的函数的内部语句所访问在一个函数当前被执行时,它的局部变量生存;执行结束后,它的局部变量消失一、局部变量在函数内部定义的变量称为局部变量.
局部变量仅能由该函数内部的语句所访问;对于该函数之外的语句来说,局部变量是不可知的.在一个函数当前被执行时,它的局部变量生存;执行结束后,它的局部变量消失.例如:f1(){int
x;......}main(){floatx;……}main函数内定义的局(或内)部变量x只能在main函数内使用.f2(x)int
x;{int
y,z;…if(x)...}f1函数内定义的局部变量x只能在f1函数内使用.f2函数内说明的x,定义的y和z只能在f2函数内使用.二、全局变量在函数体外定义的变量称为全局变量,与局部变量不同,全局变量的有效范围从定义起一直到本源文件结束止.例如:intx,a;f1(){int
a;...}main(){floaty;…}char
b;f2(z)int
z;{int
y;…if(x){int
n;…}…}全局变量x,a在f1、main、f2函数中都有效;全局变量b在f2函数中有效.全局变量a在f1函数中与局部变量a同名时,在f1函数中全局变量a无效.inta=3,b=5;main(){voidfun(void);
printf("a=%d,b=%d\n",a,b);fun();
printf("a=%d,b=%d\n",a,b);}voidfun(void){intc;c=a,a=b,b=c;}main(){voidfun(void);
inta=3,b=5;
printf("a=%d,b=%d\n",a,b);fun();
printf("a=%d,b=%d\n",a,b);}voidfun(void){intc;c=a,a=b,b=c;}main(){voidfun();
inta=3,b=5;
printf("a=%d,b=%d\n",a,b);fun(a,b);
printf("a=%d,b=%d\n",a,b);}voidfun(int
a,intb){intc;c=a,a=b,b=c;}利用全局变量实现两数交换不用全局变量,而用局部变量能实现吗?如何实现?根本无法实现!练习:写出下列程序的运行结果inta=5;main(){printf("a=%d\n",a);p1();p2();return;}
p1(){printf("a*a=%d\n",a*a);a=8;return;}p2(){printf("a*a*a=%d\n",a*a*a);return;}printf("a=%d\n",5);printf("a*a=%d\n",a*a);p1();a=8;return;p2();printf("a*a*a=%d\n",a*a*a);return;return;输出:a=5
a*a*a=512
a*a=258.9变量的存储属性在C语言中变量有两个属性:变量的类型和变量的存储方式.类型:如char、int、float等在前面的章节中介绍过一些.存储方式有四种:
自动(auto)
静态(static)
寄存器(register)
外部
(extern)前面,我们讨论了全局变量和局部变量的作用(或有效)域,我们从变量的存在空间这一角度讨论了变量的存储属性;在这一节我们将从变量值的存在时间这一角度来讨论变量的存储属性.一、局部变量的存储方式1)以自动方式存储
函数中的局部变量一般都是动态分配存储空间,对它们分配和释放存储空间的工作是由系统自动处理的.因此,这类局部变量也称为自动变量.在定义变量时用auto修饰或缺省.例如:func(){autointi,j,k;...}func(){
inti,j,k;...}autointint
相等自动变量在函数被调用时才存在,随函数的返回(或结束)而消失.2)以静态方式存储一般情况下,局部变量的值在函数调用结束后就自动消失,当希望局部变量的值不随函数的消失而释放时,可用静态方式存储局部变量.其方法是在定义变量时,用static修饰.例如求阶乘的程序如下
:main(){
inti;for(i=1;i<=4;i++)
printf(“%d!=%d\t”,i,func(i));}func(j)intj;{staticintt=1;t=t
j;returnt;}运行结果为:
2!=23!=6
for(i=2;i<=3;i++)
func(2)
func(2)
j=2;
t=1;
回传2结束func().t=2;
2
输出
2!=2_
main(){
inti;
for(i=2;i<=3;i++)
printf(“%d!=%d\t”,i,func(i));}func(j)intj;{staticintt=2;t=t
j;returnt;}func(3)
func(3)
j=3;
t=6;
回传6结束func().
func(j)intj;{staticintt=6;t=t
j;returnt;}6
输出:3!=6
main(){
inti;for(i=1;i<=4;i++)
printf(“%d!=%d\t”,i,func(i));}func(j)intj;{staticintt=1;t=t
j;returnt;}main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;/*auto*/x++;
printf("\t%d\n",x);}main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;/*static*/x++;
printf("\t%d\n",x);}试比较二者输出结果3)以寄存器方式存储为了提高程序的执行速度,C语言可直接把变量存储到CPU中的寄存器中.其方法是在定义变量时,用register修饰.例如下面是寄存器变量的定义格式:registerintx,y;或registerx,y;main(){inti=1,j=1;for(;i<=9;i++){for(j=1;j<=9;j++)
printf(“%d*%d=%2d”,i,j,i*j);
printf(“\n“);}}main(){registerinti=1,j=1;for(;i<=9;i++){for(j=1;j<=9;j++)
printf(“%d*%d=%2d”,i,j,i*j);
printf(“\n“);}}由于i,j使用频繁,将i,j设为寄存器只有自动变量和局部变量才能定义成寄存器变量4)外部变量(全局变量)的存储方式在同一源程序文件全局变量的作用域是从定义它的地方开始,一直到本源程序文件结束.
如果某个函数要求提前使用全局变量,则要在此函数中用“extern”对全局变量进行说明.例如:…f1(){externintx;.../*说明全局变量*/}...intx;/*定义全局变量*/...5)以静态方式存储由上述的讨论可知,对于定义的全局变量用“extern”进行说明,其作用是扩大了全局变量的有效域.这样做,一方面在函数之间建立了多种数据联系;另一方面给程序的结构方面带来了一些副作用.为了克服副作用,可在定义全局变量时用“static”来限定变量只能被本源程序文件引用.例如:typefile1.cstatic
intx,y;charch;main(){...}...typefile2.cexternintx,y;externcharch;func21(){...}...在file2.c中不能引用file1.c中的全局变量x和y.限定全局变量x和y只能被本源程序文件引用.6)外部变量的副作用有了外部变量后增加了一条与外界传递数据的渠道,但它作为公共信息的一种载体,也会产生一些副作用。例、程序设计者试图打印一个由“*”组成的55阶矩阵而现在它输出的又是什么?inti;main(){voidprt();for(i=0;i<5;i++)
prt();}voidprt(){for(i=0;i<5;i++)
printf("%c",'*');
printf("\n");}输出:*****(9)以下程序的输出结果是___
intfun(intx,inty)
{staticintm=0,i=2;
i+=m+1;
m=i+x+y;
returnm;
}
main()
{intj=4,m=1,k;
k=fun(j,m);printf("%d,",k);
k=fun(j,m);printf("%d\n",k);
}fun(4,1);
4,1i+=0+1;i=3;m=3+4+1;m=8;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课题申报参考:进一步全面深化经济体制改革研究
- 二零二五版车辆抵押反担保车辆租赁管理协议3篇
- 二零二五年度新型节能楼顶广告牌拆除与改造升级协议3篇
- 2025版建筑材料销售结算合同范本2篇
- 2025年度苗木种植与乡村旅游开发合同3篇
- 二零二五年度彩钢屋面防水补漏工程合同2篇
- 二零二五年度出口交易磋商与合同订立策略指南4篇
- 二零二五年度安全生产教育培训机构合作协议2篇
- 2025年度美容院员工薪酬福利及绩效管理合同
- 2025年度城市绿化工程监理委托咨询服务协议3篇
- 2024年安全教育培训试题附完整答案(夺冠系列)
- 神农架研学课程设计
- 文化资本与民族认同建构-洞察分析
- 2025新译林版英语七年级下单词默写表
- 《锡膏培训教材》课件
- 断绝父子关系协议书
- 福建省公路水运工程试验检测费用参考指标
- 大气污染控制工程 第四版
- 浅析商务英语中模糊语言的语用功能
- 工程勘察资质分级标准和工程设计资质分级标准
- 2023年四级计算机程序设计员核心考点题库300题(含答案)
评论
0/150
提交评论