以下腳本運行后各變數的值是多少?
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 明明說函式體不會改變主程式的值的
uj5u.com熱心網友回復:
因為VB里面引數有 byval 和 byref的區別byval 也就是傳值給函式,你可以理解為引數變數被復制了一份給函式,接下來函式內對這個引數怎么改變都不會影響到原變數。
byref 傳遞的是變數的參考,你可以理解為將外部變數的地址傳給了函式,函式所做的一切都是在外部變數的記憶體地址上直接進行修改,所以當函式退出的時候外部變數也會改變。
VB里引數默認傳遞方式為 byref,要改變就要顯式宣告byval引數。
uj5u.com熱心網友回復:
加紅的部分不是賦值陳述句嗎?既然賦了值,怎么會不變呢?
uj5u.com熱心網友回復:
哪里說“函式體不會改變主程式的值的”?不明白,如果函式體不能改變主程式的值,那為什么還要設定全域變數呢?難道僅僅為了讀取?uj5u.com熱心網友回復:
說明你對程式的引數還是不理解。各種語言的引數傳入時都有傳值和傳址兩種方式,只不過表述上不用,比如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
uj5u.com熱心網友回復:
我知道byval和byref的區別。樓主的帖子里面函式傳入的引數是a和b,a和b的值是沒變啊,他問的是為什么c和d變了,c和d不是傳入的引數啊,在這地方不就是全域變數嗎?
uj5u.com熱心網友回復:
樓主,你需要知道的是“變數作用域”的概念…………你所說的“函式體不會改變主程式的值的”,一般都沒這樣的說法。
也許是你對“別人的說法”理解有誤,
因此你這兒就冒出來了一句有點不著調的謙辭。
uj5u.com熱心網友回復:
樓主,你需要知道的是“變數作用域”的概念…………
你所說的“函式體不會改變主程式的值的”,一般都沒這樣的說法。
也許是你對“別人的說法”理解有誤,
因此你這兒就冒出來了一句有點不著調的謙辭。
就是這個理
uj5u.com熱心網友回復:
函式 = 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 沒有任何問題呀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/40434.html
標籤:網絡編程
上一篇:FSO 讀取檔案夾中檔案的問題
