《第9章-子程序-程序设计语言原理课件.ppt》由会员分享,可在线阅读,更多相关《第9章-子程序-程序设计语言原理课件.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9章章 子程序子程序主要内容主要内容9.1 9.1 概述概述9.2 9.2 子程序的基本原理子程序的基本原理9.3 9.3 子程序的设计问题子程序的设计问题9.4 9.4 局部引用环境局部引用环境9.5 9.5 参数传递方法参数传递方法9.6 9.6 子程序名作为参数子程序名作为参数9.7 9.7 重载子程序重载子程序9.89.8泛型子程序泛型子程序9.9 9.9 函数的设计问题函数的设计问题作业(作业(NULLNULL)9.1 9.1 概述概述n子程序子程序任何一个大程序均可分解为许多相互独立的小程序段,这些小程序段称为程序模块。可以将其中重复的或者功能相同的程序模块设计成规定格式的独立
2、程序段,这些程序段可提供给其他程序在不同的地方调用,从而可避免编制程序的重复劳动。这种可以多次反复调用的,能完成指定操作功能的特殊程序段称为“子程序”。相对而言就把调用子程序的程序称为“主程序”,把主程序调用子程序的过程称为“调用子程序”。9.2 9.2 子程序的基本概念子程序的基本概念9.2.1 9.2.1 子程序的性质子程序的性质入口个数:1被调执行,主调暂停;被调结束,控制权交给主调函数;9.2.2 9.2.2 子程序的定义子程序的定义Fortran Fortran subroutine adder(parameter)Ada Ada procedure adder(parameter)
3、Python Python def adder(parameter)C/C+C/C+void adder(parameter)9.2.3 参数参数PythonPython支持默认参数常量数组:形参的前面加上一颗星(*)散列(数组):出现在形参的最后,前面加上两颗星(*)【程序示例程序示例】def fun1(a,b=100):def fun2(p1,p2,*p3,*p4):9.2.5 过程和函数过程和函数n过程一段参数定义下的计算语句的集合在Ada语言里面的过程称为过程在Fortran里面的过程称为“子程序”n函数与过程在结构上十分类似,但其语义上模仿了数学意义上的函数;纯粹的函数不会产生副作用
4、nFortran和Ada同时提供了函数和过程n以C语言为基础的语言只有函数子程序过程函数9.2.5 过程和函数过程和函数【程序示例:Fortran-90】9.4 9.4 局部引用环境局部引用环境9.4.1 9.4.1 局部变量局部变量子程序可以定义自己的变量,从而确定局部引用环境;子程序内部定义的变量称为局部变量,作用域为所在的子程序体;局部变量可以是静态的 or 栈动态的n比较分析比较分析 1.内存共享2.历史敏感3.内存分配和释放9.4 9.4 局部引用环境局部引用环境9.4.2 9.4.2 嵌套子程序嵌套子程序来源于Algol 60(Algol 68,PASCAL,Ada);目的:过程隐
5、藏一些新的语言如Javascript,Python,Ruby等也支持嵌套子程序【思考】1.比较分析嵌套子程序和C中的static inline(静态内联)函数.2.Java中的内部类与匿名类9.5 9.5 参数传递方法参数传递方法9.5.2 9.5.2 参数传递的实现方式参数传递的实现方式1.1.按按“值值”传递传递2.2.按按“结果结果”传递传递3.3.按按“值值-结果结果”传递传递4.4.按按“引用引用”传递传递5.5.按按“名字名字”传递传递9.5.2 9.5.2 参数传递的实现方式参数传递的实现方式9.5.2.2 9.5.2.2 按按“结果结果”传递传递按结果传递是参数传递中的输出模式
6、;当一个参数以结果的形式传递时,没有值传递给子程序n按值传递存在两个问题1.实参冲突:实际参数的拷贝顺序决定着他们的值;2.实参的地址是在调用时,还是在返回时绑定。绑定时间不同,运行结果不一样。9.5.2 9.5.2 参数传递的实现方式参数传递的实现方式9.5.2.3 9.5.2.3 按按“值值-结果结果”传递传递参数输入输出型的第一种实现参数输入输出型的第一种实现也称按拷贝传递;也称按拷贝传递;调用时,实参的值拷贝到形参;调用时,实参的值拷贝到形参;返回时,形参的值拷贝到实参;返回时,形参的值拷贝到实参;需要成倍的空间来存储参数;需要成倍的空间来存储参数;优点同按优点同按“引用引用”传递传递
7、9.5.2 9.5.2 参数传递的实现方式参数传递的实现方式9.5.2.49.5.2.4按按“引用引用”传递传递n缺点缺点:很多引用参数的方式会造成别名很多引用参数的方式会造成别名1.同一个实参传递两次;2.数组成员之间的冲突3.一个子程序中的两个形参,一个是数组元素,一个是整个的数组;4.形式参数和可见的非局部变量【程序示例程序示例C+C+】9.5.2 9.5.2 参数传递的实现方式参数传递的实现方式9.5.2.5 9.5.2.5 按按“名字名字”传递传递函数中所有出现形参的地方都被实参代替page 308的表述有误!如C+泛型子程序中的泛型参数,见9.89.5 9.5 参数传递方法参数传递
8、方法9.5.3 9.5.3 参数传递方法的实现参数传递方法的实现n 运行时系统:控制程序执行的系统;n运行时栈:运行时系统初始化和维护的一块内存空间9.5 9.5 参数传递方法参数传递方法9.5.7 9.5.7 设计考虑设计考虑n单路 vs 双路 数据传输n软件工程的原则:尽可能减少子程序访问子程序外的数据的情况没有数据通过参数传回调用者输入模式;被调用的子程序没有接受数据,但必须向调用者放回数据时输出模式调用者和被调用的子程序间有双向的数据移动输入输出模式函数的副作用(9.9)9.6 9.6 子程序名作为参数子程序名作为参数sub4中调用sub2,浅层绑定,调用语句的环境决定了被传递的子程序
9、的局部引用环境子程序定义的环境,深层绑定被传递的子程序作为一个实参,特殊绑定Page 320Page 320最后一段的翻译应该如下最后一段的翻译应该如下:由于每个版本的重载子程序都具有唯一的参数列表,因此编译器可以通过不同类型的参数来消除子程序调用过程中产生的歧义。不幸的是,情况并没有想象的那么简单。当允许参数强制类型转换时,消除(重载子程序调用)歧义性的过程将变得非常的复杂。简单地说就是,如果一个方法调用过程中,(重载的方法中)没有任何一个方法在参数的数目和类型上与实际参数匹配,但是存在着两个或者更多个方法的参数列表经过强制类型转换后与实际参数匹配,这个时候到底要选择哪个方法?对于这个问题的问题,程序的设计者必须决定如何对不同的强制类型转换进行排序,使得方法调用时编译器能够选择最佳匹配的重载方法。这是一个非常棘手的问题,要想深入了解该问题的复杂程度,建议读者参阅C+中消除方法调用歧义性的一些规则(Stroustrup,1997)。9.8 9.8 泛型子程序泛型子程序n泛型代码重用,通用的操作过程可以处理不同的数据类型;nC+中的泛型函数函数模板 与宏定义的区别【程序示例】9.9 9.9 函数的设计问题函数的设计问题1.是否允许副作用2.哪些类型的值可以返回3.一共可以返回多少个值?