这是老师上课讲的题,强调名为number的函数n只能是按值传递,不能按地址传递的。(如下)
但是另外一老师提供的答案是按地址传递(Public Function number(n as inteber) as single)
我把两种都运行了一下,得到答案是一样,所以很迷茫。
请大家帮忙解释一下,到底怎么回事呢?
非常感谢!
Option Explicit
Public Sub total()
'该过程是计算s=7+77+777+……+(n个7组成的数),并输出。
Const n = 20
Dim s As Single
Dim i As Integer
For i = 1 To n
s = s + number(i)
Next i
Form1.Print "s="; s
End Sub
Public Function number([COLOR=red]ByVal n As Integer[/COLOR]) As Single
'该函数是求出n个7所组成的数。
Dim k As Integer
number = 0
For k = 1 To n
number = number + 7 * 10 ^ (k - 1)
Next k
End Function
Private Sub Form_Click()
total
End Sub
vb很久没碰了……不过,总觉得这里number用按值调用或按址调用对结果没什么影响呀,
因为在number函数里参数n没改变
按照老师的说法是如果用按地址传递参数n对过程total的计算有影响,结果只能得到7+777+77777……的结果,就是n只取到奇数的。不过我运行后并不是这样的,所以不能理解他的说明。
如果是只取到奇数项,那么在number函数里应该会有类似n=n+1的操作,如果对n没操作,在这里也就无所谓按值调用还是引用调用了
就是说如果涉及到函数形参有操作就必须得按地址传递,没有的话,两者都可以?
我觉得jimmy说的对的阿~
对N没有操作,也就无所谓了。
对于形参有操作,也要看操作的结果是不是你需要返回的阿。
如果操作了不需要返回,那也是随便的。
如果操作了,操作的结果是需要返回的,那就按址好了。
关键在于函数操作是否需要更改参数的值。
你的例子里面只是需要回传一个number的值,对N本身并不需要改变,所以无所谓怎么传递。
想了一下,你老师说的情况,可能是他混淆了for语句完成后计数器增量的问题。
因为手上的书没有记载,但在我印象中,当如下情况:
for a=1 to b
......
next a
这样的语句运行结束后,b还是原来的b,a变成[COLOR=red]b+1[/COLOR]。不知道是不是这样。
如此,在你的例子里面,n是一样不变的,只[COLOR=red]k=n+1[/COLOR],但是k又是不回传的,所以应该不会出现你老师说的跳跃。
哦……懂了,谢谢bigbiangun和jimmy解说
邑辉大哥是个人才么!~
懂得化学又懂计算机编程……
这个坛上人才果然多……小生每次看你们谈论专业知识就自卑……