Option ExplicitPrivate Sub Form_Click()
Dim a(0 To 9) As Integer, i%, f As Boolean, l&, j%, s%
For i = 10 To 1000
Erase a
l = i ^ 2
Call y((l), a, f)
'问题:为什么要用(l)?带不带()是两种结果?
'请高手解释一下。
If f Then
For j = 0 To 9
s = s + a(j)
Next j
If s = 2 Then
List1.AddItem CStr(i) & "^2=" & Str$(l)
End If
End If
s = 0
Next i
End SubPrivate Sub y(x&, a() As Integer, b As Boolean)
Dim n%, d%, i%
b = False
n = Len(CStr(x))
For i = 1 To n / 2
If Mid$(CStr(x), i, 1) <> Mid$(CStr(x), n - i + 1, 1) Then
Exit Sub
End If
Next i
b = True
For i = 1 To n
d = x Mod 10
a(d) = 1
x = x \ 10
Next i
End Sub
猜想, 这个()号貌似和参数的byref和byval方式有关........
Private Sub y(ByVal x&, a() As Integer, b As Boolean)
Option ExplicitPrivate Sub Form_Click()
Dim a(0 To 9) As Integer, i&, f As Boolean, l&, j%, s%
For i = 10 To 1000
Erase a
l = i * i
Call y(l, a, f)
'问题:为什么要用(l)?带不带()是两种结果?
'请高手解释一下。
If f Then
For j = 0 To 9
s = s + a(j)
Next j
If s = 2 Then
List1.AddItem CStr(i) & "^2=" & Str$(l)
End If
End If
s = 0
Next i
End SubPrivate Sub y(ByVal x as long, a() As Integer, b As Boolean)
Dim n%, d%, i%
b = False
n = Len(CStr(x))
For i = 1 To n / 2
If Mid$(CStr(x), i, 1) <> Mid$(CStr(x), n - i + 1, 1) Then
Exit Sub
End If
Next i
b = True
For i = 1 To n
d = x Mod 10
a(d) = 1
x = x \ 10
Next i
End Sub
Call y((l), a, f) '加上括号后,将按地址传递改为按值传递..即进行计算后,l 的值不变. 传进去是多少,出来还是多少.而Call y(l, a, f) '不加括号,是按地址传递. 经过计算后.l 的值变为了 0 . (无论传进去的值是多少,因为进行了 多次 x = x \ 10 计算,结果是0了.)
x = x + 1
End Sub 而 以 下 是 两 种 不 同 的 呼 叫 方 式 : i = 10
Call AddOne( i )
Print i i = 10
Call AddOne( (i) )
Print i 结 果 呼 叫「Call AddOne(i)」之 後 , 所 得 到 的 i 值 等 於 11, 而呼 叫「Call AddOne( (i) )」之 後 , 所 得 到 的 i 值 却 等 於 10。
函数y修改的是这个临时变量,不会影响到l
猜的在FoxPro里面,函数只有类似于byref一种方式,
有的时候不希望函数修改实参的值,
就在调用函数的时候用()把实参括起来,这样就实现类似VB的byval效果了
Dim a(0 To 9) As Integer, i%, f As Boolean, l&, j%, s%
For i=0 to 5' i = 10 To 1000
Erase a
l = i ^ 2
Call y(l, a, f)
'奇怪了,为什么如此定义:y(x%, a() As Integer, b As Boolean),
'运行时提示byref类型不符合?
'而x&不管结果正确与否,至少程序是可以执行。
'道理何在? If f Then
For j = 0 To 9
s = s + a(j)
Next j
If s = 2 Then
List1.AddItem CStr(i) & "^2=" & Str$(l)
End If
End If
s = 0
Next i
End SubPrivate Sub y(x%, a() As Integer, b As Boolean)
Dim n%, d%, i%
b = False
n = Len(CStr(x))
For i = 1 To n / 2
If Mid$(CStr(x), i, 1) <> Mid$(CStr(x), n - i + 1, 1) Then
Exit Sub
End If
Next i
b = True
For i = 1 To n
d = x Mod 10
a(d) = 1
x = x \ 10
Next i
End Sub
这我知道,为什么定义成x&又可以呢?
这是传入的数据类型 & 长整型x%这是接收的数据类型 % 整数型& 与 % 的数据类型不同.
但:
Call y(l, a, f)
为什么long可以传址调用,而integer不可以?
对于byref传递的参数,在调用时,其传入的类型必须与函数中声明的类型一致