C语言程序设计第6章(姜恒远著)

上传人:zw****58 文档编号:56950551 上传时间:2018-10-17 格式:PPT 页数:128 大小:1.01MB
返回 下载 相关 举报
C语言程序设计第6章(姜恒远著)_第1页
第1页 / 共128页
C语言程序设计第6章(姜恒远著)_第2页
第2页 / 共128页
C语言程序设计第6章(姜恒远著)_第3页
第3页 / 共128页
C语言程序设计第6章(姜恒远著)_第4页
第4页 / 共128页
C语言程序设计第6章(姜恒远著)_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《C语言程序设计第6章(姜恒远著)》由会员分享,可在线阅读,更多相关《C语言程序设计第6章(姜恒远著)(128页珍藏版)》请在金锄头文库上搜索。

1、第6章 模块化程序设计与函数,2,主要内容,6.1 函数概述 6.2 函数定义 6.3 函数返回 6.4 函数调用 6.5 标识符的作用域 6.6 变量的存储属性 6.7* 参数个数可变函数的定义及调用 6.8 宏定义与宏调用,3,6.1 函数概述,6.1.1 模块化程序设计 6.1.2 函数,4,6.1.1 模块化程序设计,大规模程序开发策略模块化 模块化程序开发基本步骤 (1) 设计阶段自顶向下将一个原始复杂任务分解为多个较简单的子任务。 (2)编码阶段自低向上为每个单一功能的子任务设计算法,将描述其算法的一组语句封装为一个独立代码块,为每个独立代码块定义一个名字和能与其他独立代码块通信的

2、接口。 模块化策略开发程序的优点从整体上简化概念结构,降低程序开发和修改的复杂度,提高程序可读性。,5,6.1.2 函数,函数是什么将一组语句封装为一个独立代码块的实现方法。 与函数有关的3个语法概念函数声明,函数调用,函数返回。,6,6.1.2 函数,#include #include int max(int x,int y); /* 函数引用性声明 */ int min(int x,int y); /* 函数引用性声明 */ int main(void) /* 函数定义性声明 */ char cmd; int a,b,c; printf(“nInput two number:”); sca

3、nf(“%d%d”, ,7,6.1.2 函数,printf(“n result is %d”,c); return 0; int max(int x,int y) /* 函数定义性声明 */ int z; if(xy) z= x; else z=y; return z; int min(int x,int y) /* 函数定义性声明 */ if(xy) z= x; else z=y; return z; ,函数声明,9,6.1.2 函数,函数定义是C源程序必不可少的构件。一个源程序中包含的所有函数定义可按任意次序保存在一个源文件(扩展名“.c” )中,也可以经分割后保存在多个源文件中。 不允许

4、将一个函数定义分割开来保存在多个源文件中。 函数定义的分类:库函数:不需定义,可多次调用,例 sqrt 自定义函数:定义一次,可多次调用,例 min,函数定义性声明,10,6.1.2 函数,函数引用性声明(简称“函数声明”)描述一个函数的特性及扩大函数名的作用域。例如:int max(int x,int y);,函数引用性声明,11,6.1.2 函数,从当前正在执行的函数跳转到另一个函数执行或重新开始执行本函数的操作。例如:max(a,b)min(a,b)printf(“n result is %d”,c),函数调用,12,6.1.2 函数,结束被调函数执行返回主调函数的操作。函数返回时,被调

5、函数可以将一个结果值带回主调函数,这个值被称为“函数返回值” 。 例如:int max(int x,int y) int z; if(xy) z= x; else z=y; return z;/* 函数返回语句,z:返回值*/,函数返回,13,6.2 函数定义,6.2.1 函数定义形式 6.2.2 函数名 6.2.3 返回值类型 6.2.4 形式参数 6.2.5 函数体 6.2.6 存储类型,14,6.2.1 函数定义形式,int min(int x,int y) /* 函数头部 */ /* 函数体开始 */int z; /* 局部变量声明 */z=xy? x:y; /* 语句 */retur

6、n z; /* 语句 */ /* 函数体结束 */,函数名,返回值类型,形式参数声明,15,6.2.1 函数定义形式,函数定义一般形式存储类型说明符 返回值类型说明符 函数名(形式参数声明列表) 声明序列语句序列 可缺省:存储类型说明符、返回值类型说明符、形式参数声明列表,16,6.2.2 函数名,函数名是函数的标识,按标识符命名规则确定。 自定义函数名的作用域规则 不允许与同一源程序中其它自定义函数同名,允许与库函数同名; 不允许与同一源程序中全局变量同名,允许与局部变量同名,允许与形式参数同名。,17,6.2.3 返回值类型,定义无返回值函数时返回值类型说明符为void 例如: void

7、print_value(int x) printf(“x = %d”,x); ,18,6.2.3 返回值类型,定义有返回值函数时必须在返回值类型说明符位置给出返回值的数据类型。 函数返回值的数据类型允许是基本类型、指针类型、结构类型、联合类型和枚举类型; 函数返回值的数据类型不允许是数组类型和函数类型。 C89标准允许缺省返回值类型说明符,缺省时编译系统假定函数的返回值类型为int。,19,6.2.4 形式参数,形式参数是一个函数与其他函数之间传递数据的接口 定义无参函数时形式参数声明为void 例如: void print_word(void) printf(“hello”); ,20,6.

8、2.4 形式参数,定义有参函数时形式参数的一般声明形式存储类型说明符 数据类型说明符 形式参数名 存储类型说明符:表示形式参数的存储属性,只能是auto与register,允许缺省,缺省时为auto。 形式参数名:是形式参数的标识,是一种局部变量,仅在该函数体内使用,在其他函数中不可见。不允许在一个函数中定义同名的多个形式参数,允许在不同函数中定义同名的形式参数。,21,6.2.4 形式参数,数据类型说明符: 指定形式参数的数据类型。 形式参数允许: 基本类型 指针类型 结构类型 联合类型 枚举类型 数组类型 函数类型,22,*6.2.4 形式参数,编译系统自动将“数据类型为T的一维数组类型”

9、调整为“基类型为T的指针类型” 例如:void fun(int x10) /*或void fun(int x )*/ x+; 形式参数声明中的“int x10”或“int x”在编译时被调整为“int *x”,23,*6.2.4 形式参数,编译系统自动将“返回T类型值的函数类型”调整为“指向返回T类型值函数的指针类型” 例如: double fun(double pf(double x) printf(“%f“,pf(1.5); 形式参数声明中的“double pf(double x)”在编译时被调整为“double (*pf)(double)”,24,*6.2.4 形式参数,当定义一个形式参

10、数时使用了const限定,表示在函数体中不允许改变该形式参数的值。 例如: int f(const int x) return +x; /* 编译错: Cannot modify a const object */ ,25,*6.2.4 形式参数,C99增加了一个类型限定符restrict,该限定符仅用于指针型标识符,表示被限定的指针型标识是引用该指针所指向对象的唯一标识符。 例如: void f(char *restrict p1, char *restrict p2) Restrict在这里表示p1和p2指向的对象只能通过p1和p2访问,26,6.2.5 函数体,函数体是一个复合语句(代码

11、块) 当复合语句中有多条声明(变量定义性声明与引用性声明、函数引用性声明)时,C89要求所有声明必须出现在第一条语句之前,C99则允许分散的声明和语句。例如: int main(void) int a;a=1;int b; /* C89报错, C99正确 */for(int i=1; i10; i+) /* C89报错,C99正确 */a*=i; ,27,6.2.6 存储类型,函数头部中的存储类型说明符定义了函数名作为一个外部标识符在多文件程序中的连接属性可使用的存储类型说明符是extern和static。缺省存储类型说明符时系统默认为extern。,28,6.3 函数返回,函数返回通过ret

12、urn语句实现 return 语句的三个用途 结束函数的执行并返回到主调函数 向主调函数传递回一个函数类型的返回值; 归还函数中定义的局部对象的存储空间,29,6.3 函数返回,return语句的两种形式 return; 返回主调函数 void型函数用“return;”完成返回操作; 函数体结束的右花括号等同于一个“return;”语句。 return (e); 返回主调函数并将e值带回主调函数 非void类型函数用“return (e);”完成返回操作并将e值带回主调函数。e:返回值表达式,圆括号可省略。数据类型允许是基本类型、指针类型、结构类型、联合类型、枚举类型。,30,6.3 函数返回

13、,C89允许非void类型函数中使用“return;”返回,对于int 型函数将返回给主调函数0值;对于其他类型函数将返回一个不确定的值并常导致返回值数据错误程序运行出错。C99规定非void类型函数必须使用“return (e);”返回。,31,6.3 函数返回,一个函数是否有返回值及返回值类型的决定因素是使用什么返回值类型说明符。 函数每次调用后返回什么值的决定因素是执行什么“return (e);”语句。允许“return (e);”中e的类型与返回值类型说明符不同,但两者应赋值兼容。 例如:int f(double x) return x*x; 最终f函数返回一个int类型值给主调函数

14、。,32,6.3 函数返回,不能通过return语句返回多个值给主调函数 例如:int f(int x,int y) return (x,y);f函数被调用时总是返回y的值,33,6.3 函数返回,当函数的返回值类型为指针类型时,应返回指针类型形式参数的值或static型局部变量的地址。 例如: char *f(char *x, char y) char z=y; *x=y;return f函数返回z的地址或y的地址是不可靠的,返回x的值是可靠的。,static,34,6.3 函数返回,main函数的特殊性 函数名不能自定义; 既允许带形式参数也允许不带形式参数。若有其形式参数,其数量和类型不能随意定义; 函数头部:C89允许“int main()”、”main()”或“void main()”;C99规定必须为“int main()”。 程序开始运行时main函数首先被操作系统调用;执行到main函数中任一return语句或函数体结束右花括号时,结束程序运行。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号