Private Sub Command1_Click()
    Dim X As Integer
    X = 1
    Call sort(X)
    Print X
    Call sort((X))
    Print X
End Sub
Private Sub sort(y As Integer)
    y = y + 1
End Sub为什么是2
        2我知道第一个2是:X = 1
                 Call sort(1)
                  y=y+1=2
     所以第一个是 Print 2
接着是Call sort((2))
这个Call sort((2))是怎么得出第二个Print 2的呢?

解决方案 »

  1.   

    Private Sub sort(y As Integer) 
    因为是ByRef传入的啊
    问了好几次了。
    Private Sub Command1_Click() 
        Dim X As Integer 
        X = 1 '这个时候 x = 1
        Call sort(X) 'Call sort(X)后 x = 2
        Print X 
        Call sort(X) 
        Print X  '这个时候 x = 3
    End Sub 
      

  2.   

    Private Sub sort(y As Integer) 
    默认是byref传址加上byvalPrivate Sub sort(byval y As Integer) 
    就不会了
      

  3.   

    第一次调用:Call sort(X)
      VB 默认是 ByRef ,调用 sort() 时,把 X 的内存地址传入,因此 sort() 中的 y 与 主调函数中的 X 是同一个东西,在 sort 中 改变 y 的值,也就把主调函数中的 X 的值改变了。第二次调用:Call sort((X))
      请注意!这次调用的参数是 (X) ,而不是 X 。
      这是有区别的!(X)指的是 变量X 的值,而不是X自身。
      因此第二次调用时,传入的地址是保存 X 的值的一个临时内存地址,而不是 X 的地址!
      所以第二次调用,sort() 函数改变的是那个临时内存地址内的值,变量 X 的内存数据并没有改变,X 的值依然是 2 。
      

  4.   

    ByVal 可选的。表示该参数按值传递。 
    ByRef 可选的。表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。 按值
    一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。按地址
    一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。
      

  5.   

    Option ExplicitPublic Sub Main()    Dim X As Integer
        
        Call Test(X, "Call Test(X, String)")
        Call Test((X), "Call Test((X), String)")
        Test X, "Test X, String"
        Test (X), "Test(X), String"End SubPrivate Sub Test(Y As Integer, strMsg As String)    MsgBox "调用形式:" & strMsg & vbLf & "参数的内存地址:" & Hex$(VarPtr(Y)), 64, "测试"End Sub