VB中函数的定义以及调用
(2016-06-27 12:34:22)| 分类: VB6编程 |
每年到了这个时候,都会看到有关函数调用的问题,今天又遇到了这样一道题目,我把答案写在我的空间里吧!
一,问题的原文如下:
执行下面程序,单击命令按钮Command1后,窗体上显示的第一行内容是 (21) ,第二行内容是 (22) ,最后一行内容是 (23) 。
Private Sub Command1_Click()
End Sub
Private Function Fun(x As Integer, y As Integer) As Integer
End Function
求详细过程
二,我的回答如下:
本文涉及到,静态变量、自定义函数、自定义函数的调用、函数中参数的类型(传值与传址类型)。
(一),静态变量
在过程或函数里,用Static声明的变量,叫静态变量,静态变量的值,将一直被保存到程序结束。
例如:在窗体上添加一个按钮,编写代码:
Private Sub Command1_Click()
End Sub
启动并单击按钮,会发现,每单击一次,k的值增加1。
说明,尽管退出Command1_Click()事件过程,但是K的值一直保持。这就是静态变量与用DIM声明的变量的不同之处。
(二),自定义函数
举个简单例子,详细介绍请看我的另一篇文章:VB6 当中自定义过程和函数的参数类型。
例如1:在窗体上添加一个按钮,编写代码:
Option Explicit
Private Sub Command1_Click()
End Sub
'下面是一个自定义函数
Private Function F() As Integer
End Function
启动程序,单击按钮,输出100。
这里Function F() As Integer表示是一个没有参数的函数,函数返回值是整数类型。在主程序里y = F()是表示把调用函数F()得到的结果,赋予变量y,其中调用的格式为F()。
例如2:在窗体上添加一个按钮,编写代码:
Option Explicit
Private Sub Command1_Click()
End Sub
'下面是一个自定义函数
Private Function F(Byval a as integer) As Integer
End Function
启动程序,单击按钮,输出16。
这里Function F(Byval a as integer) As Integer表示一个带有一个整数类型参数的函数,函数返回值是整数类型。
在主程序里y = F(8)是表示:把8作为参数调用函数F并把得到的结果,赋予变量y,其中调用的格式为F(参数)。
在进入函数里进行运算时,a的值就是主程序调用传递给它的参数8。
例如3:在窗体上添加一个按钮,编写代码:
Option Explicit
Private Sub Command1_Click()
End Sub
'下面是一个自定义函数
Private Function F(Byval a as integer) As Integer
End Function
启动程序,单击按钮,输出8
本例与例2基本相同,不同在于:
例2用一个常数作为参数调用函数,例3用一个变量调用函数,由于例3中的X值就是8,所以y的结果相同。
例如4:在窗体上添加一个按钮,编写代码:
Option Explicit
Private Sub Command1_Click()
End Sub
'下面是一个自定义函数
Private Function F(ByRef a as integer) As Integer
End Function
启动程序,单击按钮,输出9
本例与例3唯一不同在于:例3的函数定义里,参数a前面用Byval引导;例4的函数定义里,参数a前面用ByRef引导。
VB规定,Byval引导的参数采用传值方式调用,ByRef引导的参数采用传址方式调用;
传值方式调用:在调用时,把主程序的参数x的值传递给函数的参数a;传址方式调用:在调用时,把主程序的参数x的地址传递给函数的参数a(此时在函数内对a的操作其实就是在对主程序的参数x操作,因为它们指向的是同一个内存地址空间);
所以,函数内部执行a = a + 1,结果使得a为9,同时主程序的X也为9。
三,本文开头题目的分析:
在执行代码:k = Fun(1, a) + Fun((a),a)的时候,发生了调用函数,首先:
从定义语句:Private Function Fun(x As Integer, y As Integer) As Integer
可以知道:参数x与y都是传址形式的参数,所以这使得分析函数更加复杂!第1次调用:Fun(1, a)
把1传递给X,把a(a=2)传递给Y,进入函数,执行:
回到,调用处,即:k = Fun(1, a) + Fun((a),a) --------> k = 8 + Fun((a),a)
第2次调用:Fun((a),a),这里关键,因为y是传址形式的参数,所以此时,a与函数中的y值相同,即:5
所以,此时调用Fun((a),a)时,把5传递给X,把5传递给Y,进入函数,执行:
回到,调用处,即:k = 8 + Fun((a),a) --------> k = 8 + 28 --------> k = 36
所以,执行 Print k,输出36
所以本题答案,整个窗体输出:
8
28 10 18
36

加载中…