谁能给我解释下 为什么最后的结束 C 会=2 D会等于4 明明说函数体不会改变主程序的值的

qq_33906416 2019-01-12 02:04:47
以下脚本运行后各变量的值是多少?
A = 1
B = 2
C = 3
D = 4
E = 函数(a, b)
Function 函数(a, b)
函数 = a + b * a - b
c = b
d = a
End Function
答案:A=1,B=2,C=2,D=1,E=1
```谁能给我解释下 为什么最后的结束 C 会=2 D会等于4 明明说函数体不会改变主程序的值的
...全文
218 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZHRXJR 2019-01-19
  • 打赏
  • 举报
回复
函数 = a + b * a - b 即 函数 = 1 + 2 * 1 - 2,当然是 1 了
c = b 将 b 的值赋值给 c, c 当然是 2 了
d = a 将 a 的值赋值给 d, d 当然是 1 了

因此,在调用函数后:A=1,B=2,C=2,D=1,E=1 没有任何问题呀。
VB业余爱好者 2019-01-17
  • 打赏
  • 举报
回复
引用 6 楼 舉杯邀明月 的回复:
楼主,你需要知道的是“变量作用域”的概念…………

你所说的“函数体不会改变主程序的值的”,一般都没这样的说法。
 也许是你对“别人的说法”理解有误,
 因此你这儿就冒出来了一句有点不着调的谦辞。


就是这个理
脆皮大雪糕 2019-01-16
  • 打赏
  • 举报
回复
引用 3 楼 VB业余爱好者 的回复:
哪里说“函数体不会改变主程序的值的”?不明白,如果函数体不能改变主程序的值,那为什么还要设置全局变量呢?难道仅仅为了读取?
说明你对程序的参数还是不理解。各种语言的参数传入时都有传值和传址两种方式,只不过表述上不用,比如C里面就穿普通变量和传变量指针,在VB 里面就是byval 和 byref。 原理上面1楼说了,这里直接给代码看效果

Option Explicit

Private Sub test(a As Integer, ByRef b As Integer, ByVal c As Integer, ByRef d As Integer)
    Debug.Print "函数内部入参值:"; a; b; c; d
    a = a + 1
    b = b + 2
    c = c + 3
    Dim d1 As Integer
    d1 = d
    d1 = d1 + 4
    Debug.Print "函数内部处理后:"; a; b; c; d; "函数内部d1:"; d1
    
End Sub

Private Sub Command1_Click()
    Dim a As Integer, b As Integer, c As Integer, d As Integer
    a = 100: b = 200: c = 300: d = 400
    Debug.Print "函数调用前入参值:"; a; b; c; d
    test a, b, c, d
    Debug.Print "函数调用后入参值:"; a; b; c; d
    'a默认byref 会变,b显式声明byref会变,C 显式声明byval不会变 ,d声明byref但使用了函数内部变量复制了一份数据进行处理,而没有改变入参地址上的数据
End Sub
舉杯邀明月 2019-01-16
  • 打赏
  • 举报
回复
楼主,你需要知道的是“变量作用域”的概念…………

你所说的“函数体不会改变主程序的值的”,一般都没这样的说法。
 也许是你对“别人的说法”理解有误,
 因此你这儿就冒出来了一句有点不着调的谦辞。
VB业余爱好者 2019-01-16
  • 打赏
  • 举报
回复
引用 4 楼 脆皮大雪糕 的回复:
[quote=引用 3 楼 VB业余爱好者 的回复:]
哪里说“函数体不会改变主程序的值的”?不明白,如果函数体不能改变主程序的值,那为什么还要设置全局变量呢?难道仅仅为了读取?


说明你对程序的参数还是不理解。各种语言的参数传入时都有传值和传址两种方式,只不过表述上不用,比如C里面就穿普通变量和传变量指针,在VB 里面就是byval 和 byref。
原理上面1楼说了,这里直接给代码看效果


Option Explicit

Private Sub test(a As Integer, ByRef b As Integer, ByVal c As Integer, ByRef d As Integer)
Debug.Print "函数内部入参值:"; a; b; c; d
a = a + 1
b = b + 2
c = c + 3
Dim d1 As Integer
d1 = d
d1 = d1 + 4
Debug.Print "函数内部处理后:"; a; b; c; d; "函数内部d1:"; d1

End Sub

Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Integer, d As Integer
a = 100: b = 200: c = 300: d = 400
Debug.Print "函数调用前入参值:"; a; b; c; d
test a, b, c, d
Debug.Print "函数调用后入参值:"; a; b; c; d
'a默认byref 会变,b显式声明byref会变,C 显式声明byval不会变 ,d声明byref但使用了函数内部变量复制了一份数据进行处理,而没有改变入参地址上的数据
End Sub
[/quote]

我知道byval和byref的区别。楼主的帖子里面函数传入的参数是a和b,a和b的值是没变啊,他问的是为什么c和d变了,c和d不是传入的参数啊,在这地方不就是全局变量吗?
VB业余爱好者 2019-01-15
  • 打赏
  • 举报
回复
哪里说“函数体不会改变主程序的值的”?不明白,如果函数体不能改变主程序的值,那为什么还要设置全局变量呢?难道仅仅为了读取?
VB业余爱好者 2019-01-15
  • 打赏
  • 举报
回复
引用 楼主 qq_33906416 的回复:
以下脚本运行后各变量的值是多少?
A = 1
B = 2
C = 3
D = 4
E = 函数(a, b)
Function 函数(a, b)
函数 = a + b * a - b
c = b
d = a

End Function
答案:A=1,B=2,C=2,D=1,E=1
```谁能给我解释下 为什么最后的结束 C 会=2 D会等于4 明明说函数体不会改变主程序的值的


加红的部分不是赋值语句吗?既然赋了值,怎么会不变呢?
脆皮大雪糕 2019-01-12
  • 打赏
  • 举报
回复
因为VB里面参数有 byval 和 byref的区别 byval 也就是传值给函数,你可以理解为参数变量被复制了一份给函数,接下来函数内对这个参数怎么改变都不会影响到原变量。 byref 传递的是变量的引用,你可以理解为将外部变量的地址传给了函数,函数所做的一切都是在外部变量的内存地址上直接进行修改,所以当函数退出的时候外部变量也会改变。 VB里参数默认传递方式为 byref,要改变就要显式声明byval参数。

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧