一般程序设计语言包含两种基本的抽象:过程抽象和数据抽象。过程抽象有时也称控制抽象。子程序是最主要过程抽象机制。
面向对象语言中的方法与子程序的概念十分相似,不同在于它们的调用以及它们与类或对象关联的方式。
一、子程序的特征
1,每个子程序只有一个入口。
2,在执行期间,调用程序单位被停止执行,即任意时刻只有一个子程序在执行。
3,子程序执行完毕后,总是将控制返回给调用程序。
注:协同程序 和 并发程序 的特征与子程序不同。
二、两种类型的子程序
子程序分为两种类型:过程 和 函数。
过程 是定义参数化技术的语句系列,通过单个调用语句来启动这些计算。过程实际上是定义了新的语句。在Ada中将过程称为procedures,但在Fortran中则将过程称为subroutines。
函数 在结构上模仿了过程,但在语义上却模仿了数学中的函数。如果它是一个纯函数,就不会有副作用。
注:某些编程语义同时提供了过程和函数,如Fortain和Ada;某些如基于C的语言则只有函数。但C中函数的行为却与过程相似,也可以定义这些函数不返回任何值,只要将它们的返回类型定义为void。Java/C++/C#类似。
三、子程序的首部定义
1,说明它是关于某个特殊类型子程序的定义(部分语言同时包括过程和函数)。子程序的类型通常由特殊字指定。
2,首部给子程序提供了一个名字。
3,首部可以说明一系列参数(可选)
例如定义一个sum的子程序
Fortran
1 |
Subroutine sum (parameters)
|
Ada
1 |
procedure sum (parameters)
|
Python
C/C++/Java
JavaScript
1 |
function sum(parameters)
|
Ruby/JavaScript的函数与以上存在着一些有趣的不同之处。既可以在类定义时定义,也可以在类外定义。在类外定义的被认为是调用对象或根对象的方法。Ruby中如果return语句后没有表达式则返回nil,JavaScript中如果没有return则返回undefined。
四、参数
子程序通常描述的是计算,它通过两种方式来处理数据:
1、通过对非局部变量的直接访问
2、通过参数传递
前面已经提到过,纯函数只通过参数传递来计算。非纯函数是有 副作用 的。参数又分为形参和实参。
形参:子程序首部中定义的参数称为形参,又被称为 虚变量。因为它不是平常意义的变量,只有当子程序调用时它们才与存储空间 绑定。
实参:子程序调用语句包括子程序的名称及一组将子程序的形参绑定的参数,这些参数称为实参。
多数语言的实参与形参的绑定(关联) 是按位置进行的。即第一个实参对应于第一个形参,第二个实参对应于第二个形参。依次类推。如JavaScript代码
function sum(a, b) {
return a + b;
}
sum(3, 5);
函数sum定义了两个形参a, b。调用时对应的实参是3, 5。
使用位置将实参与形参关联起来是是十分有效且安全的方式。但当参数很多时(形参列表很长比如有10个以上参数),程序员很容易在调用子程序时在实参的次序上犯错。因此,有些语言中推出了解决方法称为关键字参数。
关键字参数 的意义是将形参名称与实参在一起声明。即在声明时就与实参一一对应了,它的好处是能以任何顺序出现在实参表中。如Python代码
def sum(len = myLen,
list = myList,
result = myResult)
函数定义时就将参数与变量一一对应。使用关键字参数的缺点是子程序的必须知道形参的名称。
参数默认值 在Python、Ruby、C++、Fortran 95、Ada和PHP中,形参可以有默认值。如果没有将实参传递给子程序的形参,那么将使用默认值。如Python
def show(a = 5):
print (a)
show()
定义函数show时形参a具有默认值5,调用show时如果没有传实参,那么默认打印出5。
注:Javascript之父Brendan Eich准备给该语言添加该项特性。Javascript中函数的定义有可能是如下形式:
function fun(x=5,y=10){
}
在多数语言中形参不具备默认值,调用时实参个数必须和形参匹配一致。但在C、C++、Perl和JavaScript中,则没有该项要求。虽然允许参数数目不同的设计容易引起错误,但有时也是很灵活方便的。例如C的printf函数就以打印任何数目的项。JavaScript也可以根据参数数目不同模拟函数的重载。
相关:
javascript-ecmascript-harmony-spidermonkey-spidernode-v8-v8monkey-nodejs-nodeconf/
javascript-ecmascript-harmony-coffeescript/
分享到:
相关推荐
在编程领域,子程序或函数是程序设计的基本构造块,它们允许我们将复杂的问题分解为更小、更易于管理的部分。本资源"子程序(函数)传递.rar"可能包含关于如何在编程中有效地使用函数和参数传递的详细资料。以下是关于...
子程序的传递是指在程序执行过程中,一个子程序调用另一个子程序或者函数,并可能传递数据或控制权的过程。这种机制在软件设计中至关重要,因为它促进了代码的复用、模块化和可读性。下面,我们将深入探讨子程序...
在易语言编程环境中,"指定子程序或类方法名称左键单击未找到" 这个问题通常是由于尝试调用的子程序或类方法在当前的程序库或模块中不存在,或者是由于引用路径不正确导致的。易语言是一种以中文为编程语句的编程...
过程的递归调用是编程中的一个重要概念,它是指在一个子程序或函数的执行过程中,直接或间接地调用自身。这种调用方式通常用于解决具有自我相似结构的问题,通过不断将大问题分解为小问题来求解。递归调用在函数式...
为了更好地学习和理解这个源码,可以使用易语言的集成开发环境(IDE)打开"子程序(函数)传递.e"文件,逐步调试代码,查看变量的变化,以直观地了解参数传递的过程。 7. **代码重构**: 在学习过程中,也可以尝试...
SAS自定义函数和子程序是SAS 9.2版本后引入的功能,它们极大地方便了用户的编程工作,使得用户可以根据自己的需求创建专用的代码模块。自定义函数和子程序的引入,增强了SAS语言的模块化和复用性。 自定义函数主要...
子程序地址 = 获取过程地址(DLL句柄, "函数名称") ``` 3. **调用子程序**:获取到函数地址后,我们可以创建一个自定义的子程序来调用它。这通常涉及声明子程序的参数类型和返回值类型,并使用“调用”指令执行...
`lstrcpyn`函数在易语言中用于字符串复制,但在这个上下文中,它可能被误写或与转换过程混淆了,因为这个函数并不直接涉及子程序指针的转换。 正确的转换方法通常涉及到易语言的`执行`、`调用`等命令,它们可以接受...
子程序,又称为过程,是一个没有返回值的代码段,主要用于执行一系列操作。子程序的声明使用`DECLARE SUB`,定义则使用`SUB 子程序名 ( 形式参数 )`和`END SUB`。子程序可以通过`CALL`语句调用,调用时可以提供实际...
2. **传递回调函数**:在需要使用回调的场景下,如注册窗口消息处理函数,将定义好的易语言子程序地址转换成汇编可以理解的形式,作为参数传递给相应的系统调用或库函数。 3. **汇编实现**:在汇编代码中,接收并...
它基于函数或子程序的递归调用来解析输入的源代码。这种方法的关键在于将复杂的语法结构分解为一系列简单的递归调用。每个调用对应于文法的一个非终结符,当遇到终结符时,解析器就匹配并消耗它。递归子程序法特别...
在ABAQUS这一著名的有限元分析软件中,用户可以自定义材料行为,通过编写子程序来实现特定的物理过程模拟。"UMATHTH_热_umatht子程序_"这个标题提示我们,它涉及到的是一个关于热力学行为的自定义子程序,特别地,是...
4. **与ABAQUS的集成**:将编译后的USDFLD子程序与ABAQUS求解器集成,设置相应的材料模型和参数,使得在计算过程中调用该子程序。 5. **验证和优化**:通过对比实验数据或已知理论结果,验证损伤模型的准确性,并...
在有限元分析软件ABAQUS中,移动热源问题是一个重要的研究领域,特别是在热传输...同时,掌握ABAQUS的自定义子程序编写也是提升分析能力的关键步骤,它能帮助用户解决传统方法无法处理的问题,实现更精确的仿真结果。
在PL/SQL中有两种类型的子程序:**过程**和**函数**。 - **过程**通常用来执行一系列的操作,但不返回任何值。 - **函数**不仅可以执行操作,还可以返回一个特定的值。 **子程序说明**决定了子程序的类型、名称及...
子程序回调是指在程序执行过程中,一个子程序能够将控制权交还给调用者,让调用者在特定时刻再次执行该子程序。这种机制常用于事件驱动编程、异步处理或动态加载插件等场景。在易语言中,回调通常通过函数指针或对象...
在汇编语言中实现Ackermann函数,我们需要创建一个递归子程序来计算这个函数。首先,我们需要定义数据段来存储输入的m和n以及计算过程中的临时结果。在本例中,我们有以下数据段定义: ```assembly data segment mm...
### 单片机设计中C函数和汇编子程序的相互调用及实例 #### 引言 在单片机设计领域,FranklinC51作为一款专为Intel8051系列微处理器定制的C语言开发工具,以其丰富的库函数资源和强大的数据处理能力,成为编写主...
"abaqus单元删除子程序"是这样一个高级功能,它允许用户根据预设的应力或应变条件自动移除计算过程中的某些单元。这在处理结构断裂、材料破坏等问题时特别有用,因为这些情况往往涉及到局部区域的失效。 首先,我们...