![]() ![]() |
|
计算机二级VB参数传递方式判别与解题应用 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:46:47 文章录入:杜斌 责任编辑:杜斌 | |
|
|
VB过程中使用的参数分为实参和形参,简单的讲,在过程定义中给定的参数是形参,而在过程调用语句中给定的参数是实参。当调用一个有参数的过程时,形参和实参逐一匹配传递,根据传递方式不同,可分为按值和按地址两种。对参数传递方式的正确判别是过程学习中的一个难点,也是等级考试中的一个考点。 具体判别方法,请见如下判别流程图。
三、不同传递方式对参数类型的要求 若参数按地址传递,则VB要求实参的数据类型与形参的数据类型完全一致;若参数按值传递,则实参数据类型不要求与形参完全一致,但是必须能够由VB默认转化。 四、解题应用 (一) 以江苏省计算机等级考试2001年春季的一道考题为例: 在应用程序中用“Private Function Fun(X As Integer, Y As Single)”定义了函数Fun. 调用函数Fun的过程中的变量I,J均定义为 Integer型,能正确引用函数Fun的是____ ①Fun(I,J) ②Call Fun(I,3.65) ③Fun(3.14,234) ④Fun(“245”, “231.5”) A.①③ B.②③④ C.①②③ D.①②③④ 分析: 1. 根据判别流程图,对每个引用做如下判断: 对于①Fun(I,J),实参I与形参X匹配,由于形参X不是数组并且无ByVal修饰,而实参I为变量,不是值或表达式,因此该参数将按照地址传递;同理,可以推断实参J与形参Y也将按照地址传递。根据VB要求,按照地址传递的实参和形参数据类型必须完全一致,而根据题意,J为Integer,Y为Single,因此①不正确;对于②Call Fun(I,3.65),I与X按地址传递;而实参3.65为值,与形参Y匹配时,将按值传递,因此②正确;对于③Fun(3.14,234),虽然实参3.14对应的形参X为Integer,实参234对应的形参Y为Single,但由于它们都是按照值传递,因此3.14将转化为3,而234可以直接赋给Y,因此③正确;对于④Fun(“245”, “231.5”),由于实参“245”和“231.5”均为字符串值,因此其与对应形参X、Y将按照值传递,而数字字符串是可以转化为数值类型的,因此④正确。 综上所述,正确答案为B。 2. 对于该题,由于要求是“能正确引用函数Fun的是”,因此,③④虽带括号,并且无Call引导,但却可以通过诸如:Print Fun(3.14,234)加以引用。若改为:“能正确调用函数Fun的语句是”,则此时③④不可选,只能选②。 (二) 以江苏省计算机等级考试2002年春季的一道考题为例: 调用由语句Private Sub Convent(Y As Integer)定义的Sub过程时,以下不是按值传递的语句____。 A.Call Convent((X)) B.Call Convent(X*1) C.Convent(X) D.Convent X 分析: 1. 对于A、B选项,实参分别为(X)和X*1,均为表达式,因此A、B选项中的实参将按照值传递;对于D选项,实参X未用括号引导,此时不可加Call,因此语句正确,同时,根据判别流程图,实参X与形参Y必按地址传递。分析至此,对于该题为单选题,已经可以断定答案是D。 2. 现在考虑C选项语句Convent(X)带括号,但却无Call引导,因此直觉上似乎不能正确执行。但若我们在VB代码编辑器中输入该句,回车后,该语句自动调整为:Convent (X),注意此时Convent与(X)之间有一个空格,因此该句中的括号是用于X,而不是用于Convent,所以尽管无Call引导但其却能够执行,此时实参为(X),因此参数将按值传递。所以对于Call Convent(X)和Convent(X),虽然都能执行,并非是由于Convent(X)前可以省略Call,而在于它们的实参分别是X和(X),其传递参数的方式自然就不同。 (三) 阅读程序写出运行结果: Private Sub Form_Click() Dim x As Integer, y As Integer, z As Integer x = 1: y = 2: z = 3 Call sub1(x, y, y) Print x,y,z End Sub Private Sub sub1(x As Integer, y As Integer, ByVal z As Integer) Dim I As Integer x = 3 * z: y = 2 * z: z = x + y Print x, y, z End Sub 分析: 根据判别流程图知,第一、二参数按地址传递,第三参数按值传递。因此第一、二形参与对应实参指向同一内存单元,而第三形参与对应实参值相同,但却指向不同内存单元。因此,可以作出如下参数传递与过程调用示意图。
虽然实参和形参均为x、y、z,但是请注意区分,它们具有不同的作用域。 经分析,最后答案为: 6 4 10 6 4 3 |
|
![]() ![]() |