VB有乙個傳值的題目搞不懂

2025-01-12 11:40:20 字數 2897 閱讀 3884

1樓:網友

關鍵在 proc1 的宣告上。

private sub proc1(a as integer,y as integer ,z as integer)

參數列中, a,y,z 前有兩個關鍵字,byval 或 byref.

加byval 時,過程呼叫值傳遞,即只把實引數值傳到被調過程中。像上面的例子,則,a=x=1,y=x=1,z=z=3

被調過程中的,a,y,z 為新的區域性變數,只從外界傳得到值,和點選事件中的y, z沒有任何關係。它做完運算後,沒有任何反應,所以輸出,1,1,3

加 byref 時為引用傳遞。即,該被調過程內的變數和傳遞來的變數一一對應,指向同乙個變數儲存空間。像c中的指標一樣。

a 指向x,=1,y指向x,=1,z 指向z,=3. 此時,對被調過程中的y,z 的操作就相當於對單擊事件中的x,z的操作。而被調過程中的x,既沒有宣告,也沒有指向的變數,其為這個過程內的區域性變體型變數,值為空。

z=x+y時,這個x=3*z=3*3=9. 而事件中的x 因被y 指向,所以它=y=2*z=2*3=6.

引用呼叫的計算,相當於對形參指向變數的計算。

計算中,a沒有參與運算,卻與y 同指向x,所以計算後,事件中x=y(=a),=6,y 起了作用。z=z,=15.

輸出時,只是輸出了兩次x.

而省略形參前關鍵字時,預設為 byref 引用。所以,會在呼叫過程中改變了事件中的變數值。

其與如下相同,private sub proc1(byref a as integer, byref y as integer, byref z as integer)

若將 byref 改為 byval, 會有不同結果。

只輸出事件中的三個賦值。而呼叫過程只是白跑一趟,沒有任何作用。

2樓:網友

你呼叫的過程中,為call proc1(x,x,z)也就是說前面的兩個引數相等。

執行x=3*z後,x=9

執行y=2*z後,x=y=6 "因為你呼叫的是proc1(x,x,z)

致使結果為 6 6 12

你自己除錯下 會發現的。

3樓:網友

private sub proc1(a as integer,y as integer ,z as integer)

x=3*z '執行完此句後x=9,y=1,z=3y=2*z '執行完此句後x=9,y=6,z=3z=x+y '執行完此句後x=9,y=6,z=15end sub

private sub command1_click()dim x as integer,y as integer ,z as integer

x=1 y=2

z=3 call proc1(x,x,z)print x;x;z '到這裡時x=6,y=2,z=15end sub

這幾個變數在記憶體中的關係是x位址=y位址=a=位址, 哎,打出來太多了。這個題目不是像2樓說的那麼簡單,雖然我明白是怎麼回事,但是我在這裡也說不清楚了。

vb中關於傳值和傳位址的問題?

4樓:愈金蘭錢姬

本題可以這樣理解:

a和b是傳值,也就是把x和y的值分別複製到a和b中,然後進行計算;c是傳位址,也就是把z命名乙個別稱叫c,對c的任何改變都會體現到z中,就像乙個人有學名有小名,但都是指同乙個人。

因此,z=c=a+b=5+7=12

5樓:範桂花邗月

vb的過程預設是傳位址的,即byref,而byval定義的是是傳值方式。

subfun1(byvalaas

integer,byvalbas

integer,c

asinteger)

中前兩個引數是傳值,最後乙個是傳的位址。

vb 引數傳遞問題

6樓:網友

給你解釋下址傳遞和值傳遞。

就相當於乙個人有兩個名字(比如這人叫"a","b"),那麼我叫a和叫b的結果都是乙個樣也就是我叫的都是同乙個人,只是我的叫法不一樣了,那麼假如我說原來a有1個蘋果,我給了b2個蘋果,那麼結果問a現在有幾個蘋果。因為a和b是同乙個人,我給a和給b都是達到了同樣的目的,那麼答案肯定是3個當然結論就是"只要其中乙個有了變化,那麼另乙個也隨之變化。

數值傳遞:數值傳遞則沒有這樣共用乙個記憶體位址。他只是把形參的資料複製給實參,他們分別用了兩個位址存放資料。同樣用a和b來舉例。

a有1個蘋果,現在我讓b等於a(注意我是複製,而不是說現在b也是a),然後我在給b 2個蘋果,那麼現在a還是有1個蘋果,而b有3個。因為我給的是不同的兩個人所以後面的人和前面的互不影響。

再來看你的這題。

先說明因為你這個程式裡的xyz沒有定義為過程級以上的變數,所以兩個過程中的xyz若不經過傳遞是不會當作乙個的,他們互相不干涉。為方便理解行參一律用了x1,y1,z1 實參一律用 x2,y2,z2.

根據辨別流程圖知道x y為按位址傳遞,z為按值傳遞。

call sub1(x, y, y) 呼叫了sub1過程x1=x2=1,y1=y2=2,z2=y1=2 前面x1為形參,x2為實參,前面y1為形參,y2為實參。

因為過程中的x2y2是位址傳遞,也就是說他和形參中的xy相當於同乙個人2個名字。過程中的z2是數值傳遞,只是把行慘y1的資料複製給實參z2. 也就是說x1y1改變他會導致形參x1y1變化,而實參z2的改變不會引起形參y1變化。

那麼過程中:x = 3 * z: y = 2 * z: z = x + y

就是 x=3*2,y=2*2,z=x+y print 為 x=6,y=4,z=10

注意此時因為實參xy為6和4,所以退出過程後x和y仍然是x=6,y=4)

退出過程後的 print x,y,z

因為z在程式執行過程中始終沒有用到過,sub1過程裡的z的變化不會對原來的z=3產生改變,也就是仍然為z=3

關於VB的傳值與傳地址的一道考題

這很簡單,首先我們可以看到,過程p2定義的所有引數傳遞方式都為傳值,因為每個引數前面都使用了byval關鍵字。所以過程p2的執行與否均不會影響到變數x和y的值,因此我們可以將過程p2視為不存在。接下來我們可以看到,過程p1定義的所有引數和過程p3定義的a引數均為傳址方式,這兩個過程的執行均可能會對變...

設計一個VB程式設計題目, 50,VB程式設計練習題?

private sub command1 click dim a as integer,b as integer,c as integer dim y as integer y val if y 1 then a 1000 b val y 2 then a 1500 b val y 3 then a...

vb的問題,一個vb的問題

開啟一個視窗 使用 shellexecute api 函式能夠實現自動登入,具體宣告請你參考一下 msdn 或者使用 vb 自帶的 api 檢視器來貼上宣告 用法如下 shellexecute form1.hwnd,open 名稱 sw restore 將這些 寫進標籤的 click 事件中就可以了...