加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB中函数的定义以及调用

(2016-06-27 12:34:22)
分类: VB6编程

每年到了这个时候,都会看到有关函数调用的问题,今天又遇到了这样一道题目,我把答案写在我的空间里吧!

 

一,问题的原文如下:

执行下面程序,单击命令按钮Command1后,窗体上显示的第一行内容是 (21 ,第二行内容是 (22 ,最后一行内容是 (23

Private Sub Command1_Click()

    Dim a As Integer, k AsInteger

    a = 2

    k = Fun(1, a) + Fun((a),a)

    Print k

End Sub

Private Function Fun(x As Integer, y As Integer) As Integer

    Static k As Integer

    k = k + x + y

    x = x + y

    y = y + k

    Fun = x + y

    Print Fun; x; y

End Function

求详细过程

 

二,我的回答如下:

本文涉及到,静态变量、自定义函数、自定义函数的调用、函数中参数的类型(传值与传址类型)。

(一),静态变量

在过程或函数里,用Static声明的变量,叫静态变量,静态变量的值,将一直被保存到程序结束。

例如:在窗体上添加一个按钮,编写代码:

Private Sub Command1_Click()

    Static k As Integer

    k = k + 1

    Print k

End Sub

启动并单击按钮,会发现,每单击一次,k的值增加1

说明,尽管退出Command1_Click()事件过程,但是K的值一直保持。这就是静态变量与用DIM声明的变量的不同之处。

 

(二),自定义函数

举个简单例子,详细介绍请看我的另一篇文章:VB6 当中自定义过程和函数的参数类型。

例如1:在窗体上添加一个按钮,编写代码:

Option Explicit

Private Sub Command1_Click()

   Dim y As Integer

   y = F()    '调用函数

   Print y

End Sub

'下面是一个自定义函数

Private Function F() As Integer

   F = 100

End Function

启动程序,单击按钮,输出100

这里Function F() As Integer表示是一个没有参数的函数,函数返回值是整数类型。在主程序里y = F()是表示把调用函数F()得到的结果,赋予变量y,其中调用的格式为F()

 

例如2:在窗体上添加一个按钮,编写代码:

Option Explicit

Private Sub Command1_Click()

   Dim y As Integer

   y = F(8)    '调用函数

   Print y

End Sub

'下面是一个自定义函数

Private Function F(Byval a as integer) As Integer

   F = 2 * a

   a = a + 1

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()

   Dim x as integer

   Dim y As Integer

   x = 8

   y = F(x)    '调用函数

   Print x,y

End Sub

'下面是一个自定义函数

Private Function F(Byval a as integer) As Integer

   F = 2 * a

   a = a + 1

End Function

启动程序,单击按钮,输出 16

本例与例2基本相同,不同在于:

2用一个常数作为参数调用函数,例3用一个变量调用函数,由于例3中的X值就是8,所以y的结果相同。

 

例如4:在窗体上添加一个按钮,编写代码:

Option Explicit

Private Sub Command1_Click()

   Dim x as integer

   Dim y As Integer

   x = 8

   y = F(x)    '调用函数

   Print x,y

End Sub

'下面是一个自定义函数

Private Function F(ByRef a as integer) As Integer

   F = 2 * a

   a = a + 1

End Function

启动程序,单击按钮,输出 16

本例与例3唯一不同在于:例3的函数定义里,参数a前面用Byval引导;例4的函数定义里,参数a前面用ByRef引导。

VB规定,Byval引导的参数采用传值方式调用,ByRef引导的参数采用传址方式调用;
传值方式调用:在调用时,把主程序的参数x的值传递给函数的参数a;传址方式调用:在调用时,把主程序的参数x的地址传递给函数的参数a此时在函数内对a的操作其实就是在对主程序的参数x操作,因为它们指向的是同一个内存地址空间);

所以,函数内部执行a = a + 1,结果使得a9,同时主程序的X也为9

 

三,本文开头题目的分析:

在执行代码:k = Fun(1, a) + Fun((a),a)的时候,发生了调用函数,首先:

从定义语句:Private Function Fun(x As Integer, y As Integer) As Integer

可以知道:参数xy都是传址形式的参数,所以这使得分析函数更加复杂!第1次调用:Fun(1, a)

1传递给X,把aa=2)传递给Y,进入函数,执行:

    Static k As Integer

    k = k + x + y       --------> k=0 + 1 + 2 = 3

    x = x + y             --------> x = 1 + 2 = 3

    y = y + k             --------> y = 2 + 3 = 5

    Fun = x + y        --------> fun = 3 + 5 = 8

    Print Fun; x; y    --------> 所以第1次输出:8 3 5

回到,调用处,即: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,进入函数,执行:

    Static k As Integer   'k是静态变量

    k = k + x + y       --------> k=3 + 5 + 5 = 13

    x = x + y             --------> x = 5 + 5 = 10

    y = y + k             --------> y = 5 + 13 = 18

    Fun = x + y         --------> fun = 10 + 18 = 28

    Print Fun; x; y     --------> 所以第1次输出:28 10 18

回到,调用处,即:k = 8 + Fun((a),a) --------> k = 8 + 28 --------> k = 36

所以,执行 Print k,输出36

 

所以本题答案,整个窗体输出:

5

28 10 18

36

 

2014327

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有