子程序中参数
一、局部量、全程量与作用域
我们知道,程序有变量说明语句,过程与函数也有变量说明语句。凡在程序中使用到的量,均必须先说明后使用,这是Pascal语言所具有的一个特点。同样,在过程与函数内部使用的变量,也应该在本过程或函数中加以说明,这种在子程序内部说明的变量,称之为局部变量。
另外,将那些在程序开头的说明部分加以定义与说明的量,称为全程量。
在不同的说明语句部分所说明变量,在程序中对此变量进行存取的适用范围是不同,我们将其适用范围称之为作用域。
局部变量的作用域为所在子程序。由于形式参数只在所在子程序中有郊,因此也属于局部变量。
关于这个问题,我们来看下面的一个例子:
PROGRAM Exp64-1( )
VAR
A:INTEGER;
PROOCEDUER ADD(X:INTEGER);
VAR
A1:INTEGER;
BEGIN
A1:=X+10;
WRITELN(‘A1=’,A1);
END;
BEGIN
A:=15;
ADD(A);
WRITELN(‘A=’,A);
END.
程序中,变量A在程序说明部分被定义说明,是全程变量;而变量A1则是在过程中被说明的,与形参X同属于局部变量。程序运行时,主程序调用过程ADD,将实参A的值传给形参X,然后计算表达式X+10的值,并赋值给变量A1,此时打印A1的值为:A1=25。然而,由于A1是局部变量,X是形式参数,其作用域只在本过程中有效。因而,当主程序调用完毕返回时,是无法将其值出来的。
由此可知,关于局部变量的作用域的实质我们这样来理解:当其所在的子程序被调用时,局部变量才分配有确定的存储单元,而当程序的执行一旦返回到调用程序时,局部变量所占用的存储就被释放。
至于全程变量的作用域,情况就复杂一点,我们还是先来看以下的一个例题:
PROGRAM EXP64-2( )
VAR
A,B调用子程序的例子:INTEGER;
PROCEDURE SUB;
A:INTEGER;
BEGIN
WRITE(‘A2=’,A,‘ B2=’,B);
A:=A+10;
B:=B+10;
WRITE(‘A3=’,A,‘ B3=‘,B);
END;
BEGIN
A:=15;B:=20;
WRITELN(‘A1=‘,A,‘ B1=’,B);
SUB;
WRITELN(‘A4=’,A,‘ B4=’,B);
END.
请注意仔细观察该程序,程序中两处说明了变量A,一处是在主程序的说明部分,另一处是在过程中说明的,这种变量称为同名的全程变量与局部变量。
为了保持灵活的编程风格,Turbo Pascal允许在函数和过程中有局部变量。局部变量可以和程序其它部分的变量具有相同的名字,因为它们是相互独立的变量,所以不致于产生冲突。
Pascal对其处理的原则是:
(1)在主程序中,全程的那个变量起作用;而在子程序中局部的那个变量起作用。
(2)在执行子程序的过程中,新分配的局部变量单元有效;一旦返回主程序,编译程序会回收局部单元,而在子程序执行中被屏蔽住的全程变量重新有效。
由此,我们可以知道,引入局部变量的好处不仅在于可以节省内存空间,更重要的是给结构化程序设计带来了很大的方便。在一个稍大一点的程序中,需要编写程或函数时,为了不相互产生影响,往往使用局部变量;而当相互之间需要联系时,则采用全程变量或形式参数(这一点在下面介绍)来实现。同时,在程序设计时使用局部,也容易合程序清晰易懂,不致于引起不必要的混乱。
二、值参数与变量参数
前面我们提出,Pascal语言中过程与函数的主要参数种类有值参数与变量参数。
变量参数在形式上比值参数多了一个前缀VAR。但两者不仅含义不同,且相同的实在参数的形式及参数之间的传递关系均有区别,效能也有所不同。
首先,我们应该知道,在调用过程时必须用实在参数去代替参数。因此,实在参数的个数、顺序和类型都必须与参数一一对应。
Turbo Pascal在处理数据传送时有两种方法。一种是传值,另一种方法是传地址。
传值就是实在参数的值仅向形式参数作单向传送,形式参数的值发生变化不会反过来影响实在参数的值。例如函数调用时就是采用了“按值传送”的方法,返回时只由函数名带回一个函数值。
Turbo Pascal的过程也可用值参数方法传递数据,请看下例:
PROGRAM EXOP64-3( )
VAR
A:INTEGER;
PROCEDURE ADD(A1:INTEGER);
BEGIN
A1;=A1+20
WRITELN(‘A1=’,A1);
END;
BRGIN
A:=10;
ADD(A);
WRITELN(‘A=’,a);
END。
传地址就是调用的过程能够影响传送给它的变量的值,从而能把信息传给调用者。
以下的例子就是用“按址传送”的方法进行的:
PROGRAM EXP64-4( );
VAR
A:INTEGER;
PROCEDURE ADD(VAR C:INTEGER);
BEGIN
C:=C+10;
WRITELN(‘C=’,C);
END;
BEGIN
A:=10;
ADD(A);
WRITELN(‘A=’,A);
END。
综上所述,我们可以得到如下的结论:Turbo Pascal中值形参的作用仅仅是将子程序外部的值传递给过程或函数,因此又称值参数是输入参数,所对应的实际参数可以是常数、变量或表达式。而变量参数除了能将子程序外部的数据传递过程或函数,更重要是它能将子程序中变化的形式参数的值带出来,所以又称变量参数称之为输出参数,其对应的实际参数必须变量。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论