版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、12第第4章章 函数与编译预处理函数与编译预处理 34.1 函数概述函数概述C程序程序源程序文件源程序文件n函数函数1函数函数m 源程序文件源程序文件1函数函数1函数函数n4.1.1 函数简介函数简介4【例例】 #include void print_line() /*函数定义函数定义*/ printf(*n);void print_text() /*函数定义函数定义*/ printf( Welcome to Beijing n);void main() print_line(); /*函数调用函数调用*/print_text(); /*函数调用函数调用*/print_line(); /*函数
2、调用函数调用*/程序的执行总是程序的执行总是从从main函数开始函数开始56 一个一个C源程序可以由一个或多个源程序文件组源程序可以由一个或多个源程序文件组成。成。C编译系统在对编译系统在对C源程序进行编译时是以文件源程序进行编译时是以文件为单位进行的。为单位进行的。 一个一个C源程序文件可以由一个或多个函数组成。源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。其它函数可以相互调用。 在一个在一个C程序中,有且仅有一个主函数程序中,有且仅有一个主函数main。C程序的执行总是从程序的执行总是从ma
3、in函数开始,调用其它函数函数开始,调用其它函数后最终回到后最终回到main函数,在函数,在main函数中结束整个程函数中结束整个程序的运行。序的运行。7 函数的种类函数的种类8n由由C编译系统定义的一种函数,存放在系统函数编译系统定义的一种函数,存放在系统函数库中,用户可以根据需要随时调用库中,用户可以根据需要随时调用n常用函数常用函数如:如:fabs、sqrt、sin、pow、rand(常用数学函数参见教材常用数学函数参见教材P100 表表4-1和附录和附录B )n函数调用形式函数调用形式:函数名(参数表)函数名(参数表)例如:例如: sqrt(x)4.1.2 数学库函数数学库函数9例例#
4、include #include void main( ) float x=4.5; printf (%f, %f, %fn ,sqrt(x),pow(x,2),fabs(-x); 104.2.1 函数的定义函数的定义函数定义的一般形式函数定义的一般形式函数类型函数类型 函数名函数名( (类型名类型名 形式参数形式参数1, ) ) 说明语句说明语句 执行语句执行语句 例如:求两个数的最大值。例如:求两个数的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );4.2 函数定义及调用函数定义及调用11#includeint (
5、int y); /*函数原型声明函数原型声明*/void () int x,last,nowcb; last=1; printf(15之间,相邻两数的立方差是:之间,相邻两数的立方差是:n); for(x=2;xmax) max=iabs(a); /*函数调用构成表达式函数调用构成表达式*/ m=max(c,max(a,b); /*函数调用作为函数参数函数调用作为函数参数*/4.2.2 函数的调用函数的调用函数调用的一般形式:函数调用的一般形式:13void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);mai
6、n( ) int a=10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);4.2.3 函数参数传递与返回值函数参数传递与返回值1函数的参数传递(值传递)函数的参数传递(值传递)程序输出结果:程序输出结果:x=20,y=10a=10,b=20形式参数(形参)形式参数(形参)实际参数(实参)实际参数(实参)【例例】编一程序,将主函数中的两个变量的值传递给编一程序,将主函数中的两个变量的值传递给swap函函数中的两个形参,交换两个形参的值。数中的两个形参,交换两个形参的值。单向值传递单向值传递14有关形参和实参的说明:有关形参和实参的说明: 当函数被调用时才给形参
7、分配内存单元。调用结当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。束,所占内存被释放。 实参可以是常量、变量或表达式,但要求它们有实参可以是常量、变量或表达式,但要求它们有确定的值。确定的值。 实参与形参类型要一致,字符型与整型兼容。实参与形参类型要一致,字符型与整型兼容。 实参与形参的个数必须相等。在函数调用时,实实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。参的值赋给与之相对应的形参。“单向值传递单向值传递”。15函数的返回值是通过函数的返回值是通过return语句带回到主调函数的语句带回到主调函数的功能:功能:终止函数的运行,返回主调函数,若有返回
8、值,将终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。返回值带回主调函数。2.函数的返回值函数的返回值16【例例】计算并输出圆的面积。计算并输出圆的面积。#include s(int r) return 3.14*r*r;void main( ) int r; scanf(%d,&r); printf(%dn,s(r);程序运行情况如下:程序运行情况如下:2 12说明:说明:函数的类型决定了函数返回值的类型。若省略函数的类函数的类型决定了函数返回值的类型。若省略函数的类型,系统默认其为型,系统默认其为int型。型。无返回值的函数应将其类型定义为无返回值的函数应将其类型定义为vo
9、id (空)类型。(空)类型。17【例例4-8】编写函数实现两组变量的显示编写函数实现两组变量的显示 定义定义2组,共组,共8个整型变量个整型变量a1a4,b1b4,要求:输入字符,要求:输入字符a和整数和整数1,显,显示示a1变量的值,输入字符变量的值,输入字符b和整数和整数1,显示,显示b1变量的值变量的值18#include int ArrayOperating(int i,char ch)int a1=1,a2=0,a3=3,a4=5; int b1=2,b2=0,b3=4,b4=3; switch(i) case 1: switch(ch) case a: return a1; ca
10、se b: return b1; case 2: case 3: case 4: void main() int i;char ch; printf(输入显示的变量,输入显示的变量,形式如:形式如:a1或或b4:); scanf(%c%d,&ch,&i); printf(%c%d=%dn,ch, i,ArrayOperating(i,ch); 194.2.4 函数的嵌套调用函数的嵌套调用20【例例】函数的嵌套调用函数的嵌套调用程序输出结果:程序输出结果:9 21 4.2.5 对被调函数的声明和函数原型对被调函数的声明和函数原型void swap(int x, int y) main( ) sw
11、ap(a,b); 22对被调函数进行声明的一般形式对被调函数进行声明的一般形式 函数类型函数类型 函数名(函数名(参数类型参数类型1 1 参数名参数名1 1,); ;或或 函数类型函数类型 函数名(函数名(参数类型参数类型1 1,参数类型参数类型2 2,); ;第二种形式省略了参数名,此种形式也称为第二种形式省略了参数名,此种形式也称为函数的原型函数的原型。 如果非整型函数在主调函数之后定义,如果非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被则应在主调函数中或主调函数之前对被调函数进行声明。调函数进行声明。23#include void main( ) float calc(
12、float x,float y,char opr); float a,b; char opr; printf(n输入四则运算表达式输入四则运算表达式:); scanf(%f%c%f,&a,&opr,&b); if(opr=+|opr=-|opr=*|opr=/) printf(%5.2f%c%5.2f=%6.2fn,a,opr,b,calc(a,b,opr); else printf(非法运算符非法运算符! n ); float calc(float x,float y,char opr) switch(opr) case +: return(x+y); case -:return(x-y);
13、 case *:return(x*y); case /:return(x/y); 对被调函对被调函数的声明数的声明【例例4-12】计算并输出两个数的和、差、积、商。计算并输出两个数的和、差、积、商。244.3 局部变量和全局变量局部变量和全局变量:变量在程序中可以被使用的范围。:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为根据变量的作用域可以将变量分为局部变量和全局局部变量和全局变量变量。():在函数内或复合语句:在函数内或复合语句内内定定义的变量以及义的变量以及。:函数内或复合语句内函数内或复合语句内。4.3.1 局部作用域和局部变量局部作用域和局部变量【例例】分析下面程序的
14、运行结果及变量的作用域。分析下面程序的运行结果及变量的作用域。25void sub(int a,int b) int c; a=a+b; b=b+a; c=b-a;printf(sub:ta=%d b= %d c= %dn,a,b,c); void main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(mai
15、n:ta=%d b= %d c= %dn,a,b,c); “分程序分程序”或或“程序程序块块”程序输出结果:程序输出结果:main: a=1 b= 1 c= 1sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 1264.3.2 全局作用域和全局变量全局作用域和全局变量():在):在函数外部函数外部定义的变量。定义的变量。:。【例例】全局变量和局部变量的作用域。全局变量和局部变量的作用域。27int a = 5;void f(int x, int y) int b,c; b=a+x; c=a-y;p
16、rintf(%dt%dt%dn,a,b,c); main( ) int b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 程序输出结果:程序输出结果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局变量全局变量“分程序分程序”或或“程序程序块块”int284.4 变量的生存期和存储类别变量的生存期和存储类别4.4.1 变量的生存期变量的生存期变量的生存期变量的生
17、存期:变量在内存中占据存储空间的时间。:变量在内存中占据存储空间的时间。程序代码区静态存储区动态存储区存储分配存储分配动态存储变量动态存储变量静态存储变量静态存储变量294.4.2 变量的存储类别变量的存储类别变量的属性30变量定义语句的一般形式变量定义语句的一般形式 311自动变量(自动变量(auto类别)类别)main()int x,y; main()auto int x,y; 等价等价可省局部变量可以定义为自动变量。局部变量可以定义为自动变量。32main() int a,b,c; printf(“Enter a,b:n”); scanf(“%d%d”,&a,&b); c=sum(a,b
18、); printf(“Sum=%dn”,c);sum(int a,int b) int c=0; c=a+b; return(c);printf(“Enter a,b:n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%dn”,c);main()Enter a,b:静态静态存储区存储区am 不定不定bm 不定不定cm 不定不定1 2 as=1bs=2cs=0bm=2am=1sum(int a,int b)Sum=3程序区程序区动态动态存储区存储区观察下列程序运行时变量的存储情况观察下列程序运行时变量的存储情况单击开始运
19、行as=1bs=2cs=3cm =3 33 内存分配内存分配调用函数或执行分程序时在调用函数或执行分程序时在动态存储区动态存储区为其分配存储单元,为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。函数或分程序执行结束,所占内存空间即刻释放。 变量的初值变量的初值定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的初值不确定初值不确定;如果赋初值则;如果赋初值则每次函数被调用时执行一次赋值操作。每次函数被调用时执行一次赋值操作。 生存期生存期 在函数或分程序执行期间。在函数或分程序执行期间。 作用域作用域自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。342静态变
20、量(静态变量(static类别)类别)除形参外,局部变量和全局变量都可以定义为静态变量。除形参外,局部变量和全局变量都可以定义为静态变量。static int a; main( ) float x,y; f( ) static int b=1; 全局静态变量全局静态变量不能省35 内存分配内存分配编译时,将其分配在内存的静态存储区中,程序运行结束编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。释放该单元。 静态变量的初值静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为若定义时未赋初值,在编译时,系统自动赋初值为0 0;若定;若定义时赋初值,则仅在编译时赋初值一次,程序运
21、行后不再义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值给变量赋初值 。 生存期生存期整个程序的执行期间。整个程序的执行期间。 作用域作用域局部静态变量的作用域是它所在的函数或分程序。全局静局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。态变量的作用域是从定义处开始到本源文件结束。36【例例】静态变量的使用。静态变量的使用。37int c;static int a; main( ) float ; char s;f( ) static int b=1; 3.外部变量(外部变量(extern类别)类别)在函数外定义的变量若没有用在函数外
22、定义的变量若没有用 static说明,则是外部变量。说明,则是外部变量。外部变量只能隐式定义为外部变量只能隐式定义为extern类别,不能显式定义。类别,不能显式定义。全局静态变量全局静态变量外部变量外部变量38外部变量声明的一般格式外部变量声明的一般格式注意:注意:外部变量声明用关键字外部变量声明用关键字externextern,而外部变量的,而外部变量的定义不能用定义不能用externextern,只能隐式定义。,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过只是让编译系统知道该变量是一个已经定义过的外
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度企业兼职市场营销人员合同2篇
- 在线健康信息替代搜寻对老年人健康素养的影响研究-基于社会认知理论
- 医生年终工作总结
- 2025年度绿色建筑合作框架协议范本3篇
- 基于前景理论的大规模传染疫情应急管理决策研究
- 二零二五年POS机租赁与移动支付安全监控合同3篇
- 临床胃肠镜术前术后护理要点
- Unit 4 Lesson 1My family photo(说课稿)-2024-2025学年冀教版(2024)初中英语七年级上册
- 全国冀教版信息技术三年级上册新授课 二 画大熊猫 说课稿
- Unit 8 Knowing the world Lesson4 Same Time,Different Weather 说课稿 2024-2025学年冀教版(2024)七年级英语上册
- DB44∕T 2149-2018 森林资源规划设计调查技术规程
- 肝移植的历史、现状与展望
- 商业定价表(含各商铺价格测算销售回款)
- 【化学】重庆市2021-2022学年高一上学期期末联合检测试题
- 供应商物料质量问题赔偿协议(终端)
- 单位工程质量控制程序流程图
- 部编版小学语文三年级(下册)学期课程纲要
- 化学工业有毒有害作业工种范围表
- 洼田饮水试验
- 定置定位管理一
- 商票保贴协议
评论
0/150
提交评论