- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章
第 PAGE 115页
第6章 函数和过程
程序表达的计算本身近似于代数演算,演算在符号上进行。只要给出实际的输入值即可得到输出值或所需要的计算机动作。一般说来,程序是通用的,适合于一组输入值。如果把程序中某一段实施某种功能的计算单独划出来,给它取个名字并给出本段所需的参数, 即将名字束定于执行某种功能的代码块。在程序世界里这段程序叫子程序。50年代人们就理解了这种分割的好处:它实施的功能单一,便于调试;它相对独立,便于多人分工完成,且时间不受约束;它相对封闭,所有数据从接口出入,人们易于控制,是分解复杂性的有力措施。
命令式语言中子程序有两种形式:函数(必须返回值)和过程(实施一组动作),有时叫函数过程和子例程subroutine。它们是程序的第一次分割。
子程序开创程序世界里局部性、模块性的先河。由于子程序是程序的一个相对独立部分, 它和主程序联系的接口特别重要。在这个界面上要指出该例程的数据特征,即输入什么输出什么。而整个子程序体是完成从输入到输出的实现手段。因此,界面指出“做什么?”而子程序体回答“怎么做”。于是,在80年代程序完成第二次分割:将子程序定义(即界面)和子程序体显式的分开,成为相对独立的规格说明(Specification)和体(body)。这样在程序设计的早期只写规格,详细设计时再选算法、数据结构实现它的体。只要规格说明不变,即使过程体作重大的修改或换掉也不会影响整个程序系统。Ada 和C++即是完成第二次分割的实例。
本章我们首先研究函数和过程的定义和调用。关注的焦点在第二章中讨论,它们的接口和数据传送机制。
原则上所有的程序值都可以作参数传递,第三节讨论实参求值策略,最后讨论参数本身为函数或返回值及函数的高阶函数。
6.1 函数和过程抽象
函数抽象是用一个简单的名字抽象代表一个函数。该函数由函数型构(Signature)和函数体(body)组成。函数计算的目的是求值。函数体等同于一个复合的表达式。所以,函数抽象是对表达式的抽象。同样,过程抽象是用一个简单的名字抽象代表一个计算过程。该过程由过程型构和过程体组成。过程调用的目的是执行一组命令以更新数据,过程抽象是对命令(即语句)集的抽象。
6.1.1 函数定义与引用
函数定义定义了一个程序世界的函数,它有名字,输入、输出参数(组成函数型构), 和实现函数从输入到输出的映射的函数体组成:
function FUNC (fp1,fp2,...):returntype; //函数型构
B; //函数体,可包括任何声明和语句
函数型构中fp1,fp2,…为形式参数,也叫形式变元(argument).returntype为返回值类型,函数引用是应用函数的唯一手段,它在同名的函数名之下给出实在参数(实在变元):
FUNC (ap1,ap2,...);
其应用过程是:先匹配函数名,找到函数定义模块,然后匹配形、实参数。匹配后程序控制转而执行函数体。实参以形参别名参与运行直至函数体结束,或至显式的Return语句。主调程序的引用处此时得到一函数返回值。函数引用可出现在任何求值的表达式中。返回的参数值在程序的下文显式引用。
(1) 函数定义的形式
早期语言函数定义和子程序一样,都是过程的一种。但函数要返回值,于是函数名同时起到携带返回值的作用,函数返回值的类型加在函数关键字之前,如例6-1(a)。函数名至少要出现在赋值号之前一次;局部量和参数的类型在型构之后语句开始之前声明;至少要有一个RETURN语句。
Pascal和Ada函数返回值的类型放在型构后,且参数类型在参数表中声明,和局部量声明明显分开,且Return只作中途返回之用,不用Return从块末出口也可以。由于Pascal支持递归,它承袭了函数名至少在赋值号左边出现一次,于是造成名字含义不同,见例6-1(b),左边的函数名是变量引用,右边是函数引用。Ada(见例6-1(d))就避免了这个缺点:函数名仅仅是函数名,返回值由return关键字后跟的表达式表示,其求值结果为某个临时的中间变量,程序员不可见。return机制同pascal。这样,和充当块结束括号的关键字end分工也明确了(一指程序行文结束,一指执行结束)。
C语言,见例6-1(c),在函数型构和局部量声明的形式与Pascal同。用return加表达式指明返回值与Ada同。但由于C只有函数形式,若为主函数或过程则无return语句,且缺省的函数返回值类型等同于int型。ANSI C和C++进一步吸取在参数表中指明参数类型的优点。
例6-1
文档评论(0)