×

vb函数参数的传递

Kalet Kalet 发表于2009-03-20 12:00:13 浏览344 评论0

抢沙发发表评论


实际上,形参的完整的语法格式应该为:

[[Optional][ByVal|ByRef]|ParamArray] <变量名> [()][As <类型>][=<缺省值>]
vb函数参数的传递
ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个***的存储空间,形参的存储空间是调用时才分配的。如果选择值参,则实参与过程体内的运算无关,它仍保留原值。因此,为了保护实参不受过程运算的影响,应选用数值参数。

ByRef表 示该参数按地址传递,称为变量参数,简称变参。此时形参与实参共同占用同一个存储空间,而实参的存储空间是调用前就分配了的。如果选择变参,则实参与过程 体内的运算有关,形参的改变会影响变参的值。因此,当被调过程需要向调用方传递两个及两个以上的值时,应选用地址传递。由于变参是VB默认的传值方式,所以在此之前,很多地方我们使用的都是变参。

需要说明的是:如果实参为常量,就是值参了

值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。
值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。
地址传递:传递地址,形参与实参用的是同一个地址,形参的变化会直接带给实参,属于 “双向传递”。此时,形参、实参一般是变量或数组。

Option Base 1

Private Sub Command1_Click()

    Dim a(3) As Single, b(3) As Single, c(3) As Single

    Dim x As Single, y As Single

    Dim i As Integer

    For i = 1 To 3

        a(i) = Val(InputBox("请输入第" & i & "个方程的系数a:", "输入框"))

        b(i) = Val(InputBox("请输入第" & i & "个方程的系数b:", "输入框"))

        c(i) = Val(InputBox("请输入第" & i & "个方程的系数c:", "输入框"))

        Call root(a(i), b(i), c(i), x, y)

        Print "第"; i; "个方程"; a(i); "X^2+"; b(i); "X+"; c(i); "=0的根为:"

    Next i

  Print x, y

Call oneline

End Sub

Public Sub root(ByVal a As Single, _

ByVal b As Single, ByVal c As Single, _

             x1 As Single, x2 As Single)//vb默认的是变参

    Dim d As Single

    Dim p As Single, q As Single

    d = b * b - 4 * a * c
vb函数参数的传递
    p = -b / 2 / a: q = Sqr(d) / 2 / a

    x1 = p + q: x2 = p - q

End Sub

Public Sub oneline()

    Dim k As Integer

    For k = 1 To 40

        Print "=";

    Next k

    Print

End Sub

 

说明:

⑴a、b、c、x1、x2为形参,a(i)、b(i)、c(i)、x、y为实参。

⑵其中a、b、c为值参,x1、x2为变参。
关于函数传参ByVal与ByRef之间的异同点
-------------------------------------

首先,两种方式得到的结果毋庸置疑,肯定是一样的.

使用ByRef传参会改变量本身的值,而ByVal则不会,因为ByVal仅仅是将变量的副本传递到函数中.

那么使用这两种方式传参对代码的效率会有什么影响呢?我想,这是大部分程序员所关心的.

在 默认情况下,VB是按ByRef传递参数的,在一般情况下ByVal方式要比ByRef传递参数快,但当你要传递比较大的字符串或数组时,ByRef方式 就要比ByVal方式快,因为ByRef仅仅需要传递指向数据的四字节指针,而不是实际的数据.所以,在进行应用的时候,可以考虑实际情况进行处理,以便 达到最佳的运行速度.


题外话:

长整型变量(Long)是VB中最快的变量类型.
在做运算的时候,如果不是必须要保留小数,尽量避免使用浮点运算,因为整数运算不需要使用数字协处理器.
尽量避免使用对象的属性代替常量进行运算,针对于任何对象属性的访问都会影响运算的速度.vb函数参数的传递
尽量使用动态数组,而避免使用静态数组,因为通过Erase方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.


群贤毕至

访客