VB參數傳遞方式判別與解題套用

vb過程中使用的參數分為實參和形參,簡單的講,在過程定義中給定的參數是形參,而在過程調用語句中給定的參數是實參。當調用一個有參數的過程時,形參和實參逐一匹配傳遞,根據傳遞方式不同,可分為按值和按地址兩種。對參數傳遞方式的正確判別是過程學習中的一個難點,也是等級考試中的一個考點。

一、 按值與按地址方式的內涵

按值傳遞參數,實質上是將實參的值複製一份給形參,因此形參獲得的是實參的副本,當過程執行中對形參進行改變,並不會影響實參本身;按地址傳遞參數,實質上是將實參變數的地址傳遞給形參,因此形參與實參將指向同一記憶體單元,當過程執行中形參發生改變時,對應實參也將跟著改變。

二、 參數傳遞方式判別方法


判斷參數傳遞方式,不能單純的看過程定義中形參前的修飾限定詞有無byval。參數傳遞到底採用何種方式,不僅取決於過程定義,還取決於過程調用,即與對應實參的具體形式也有很大關係。因此,應該從以下三個方面綜合考慮:

1. 形參是否為數組或者控制項

2. 形參前是否有byval修飾

3. 對應實參是否為表達式或者值

具體判別方法,請見如下判別流程圖。

三、不同傳遞方式對參數類型的要求


若參數按地址傳遞,則vb要求實參的數據類型與形參的數據類型完全一致;若參數按值傳遞,則實參數據類型不要求與形參完全一致,但是必須能夠由vb默認轉化。


四、解題套用


(一) 以江蘇省計算機等級考試2001年春季的一道考題為例:


在應用程式中用“private function fun(x as integer, y as single)”定義了函式fun. 調用函式fun的過程中的變數i,j均定義為 integer型,能正確引用函式fun的是____

①fun(i,j) ②call fun(i,3.65)

③fun(3.14,234) ④fun(“245”, “231.5”)

a.①③ b.②③④ c.①②③ d.①②③④

分析:


1. 根據判別流程圖,對每個引用做如下判斷:


對於①fun(i,j),實參i與形參x匹配,由於形參x不是數組並且無byval修飾,而實參i為變數,不是值或表達式,因此該參數將按照地址傳遞;同理,可以推斷實參j與形參y也將按照地址傳遞。根據vb要求,按照地址傳遞的實參和形參數據類型必須完全一致,而根據題意,j為integer,y為single,因此①不正確;對於②call fun(i,3.65),i與x按地址傳遞;而實參3.65為值,與形參y匹配時,將按值傳遞,因此②正確;對於③fun(3.14,234),雖然實參3.14對應的形參x為integer,實參234對應的形參y為single,但由於它們都是按照值傳遞,因此3.14將轉化為3,而234可以直接賦給y,因此③正確;對於④fun(“245”, “231.5”),由於實參“245”和“231.5”均為字元串值,因此其與對應形參x、y將按照值傳遞,而數字字元串是可以轉化為數值類型的,因此④正確。


綜上所述,正確答案為b。


2. 對於該題,由於要求是“能正確引用函式fun的是”,因此,③④雖帶括弧,並且無call引導,但卻可以通過諸如:print fun(3.14,234)加以引用。若改為:“能正確調用函式fun的語句是”,則此時③④不可選,只能選②。


(二) 以江蘇省計算機等級考試2002年春季的一道考題為例:

調用由語句private sub convent(y as integer)定義的sub過程時,以下不是按值傳遞的語句____。

a.call convent((x)) b.call convent(x*1)

c.convent(x) d.convent x


分析:


1. 對於a、b選項,實參分別為(x)和x*1,均為表達式,因此a、b選項中的實參將按照值傳遞;對於d選項,實參x未用括弧引導,此時不可加call,因此語句正確,同時,根據判別流程圖,實參x與形參y必按地址傳遞。分析至此,對於該題為單選題,已經可以斷定答案是d。


2. 現在考慮c選項語句convent(x)帶括弧,但卻無call引導,因此直覺上似乎不能正確執行。但若我們在vb代碼編輯器中輸入該句,回車後,該語句自動調整為:convent (x),注意此時convent與(x)之間有一個空格,因此該句中的括弧是用於x,而不是用於convent,所以儘管無call引導但其卻能夠執行,此時實參為(x),因此參數將按值傳遞。所以對於call convent(x)和convent(x),雖然都能執行,並非是由於convent(x)前可以省略call,而在於它們的實參分別是x和(x),其傳遞參數的方式自然就不同。


(三) 閱讀程式寫出運行結果:


private sub form_click()

dim x as integer, y as integer, z as integer

x = 1: y = 2: z = 3

call sub1(x, y, y)

print x,y,z

end sub

private sub sub1(x as integer, y as integer, byval z as integer)

dim i as integer

x = 3 * z: y = 2 * z: z = x y

print x, y, z

end sub

分析:

根據判別流程圖知,第一、二參數按地址傳遞,第三參數按值傳遞。因此第一、二形參與對應實參指向同一記憶體單元,而第三形參與對應實參值相同,但卻指向不同記憶體單元。因此,可以作出如下參數傳遞與過程調用示意圖。

雖然實參和形參均為x、y、z,但是請注意區分,它們具有不同的作用域。

經分析,最後答案為:

6 4 10

6 4 3

vb過程中使用的參數分為實參和形參,簡單的講,在過程定義中給定的參數是形參,而在過程調用語句中給定的參數是實參。當調用一個有參數的過程時,形參和實參逐一匹配傳遞,根據傳遞方式不同,可分為按值和按地址兩種。對參數傳遞方式的正確判別是過程學習中的一個難點,也是等級考試中的一個考點。

一、 按值與按地址方式的內涵

按值傳遞參數,實質上是將實參的值複製一份給形參,因此形參獲得的是實參的副本,當過程執行中對形參進行改變,並不會影響實參本身;按地址傳遞參數,實質上是將實參變數的地址傳遞給形參,因此形參與實參將指向同一記憶體單元,當過程執行中形參發生改變時,對應實參也將跟著改變。

二、 參數傳遞方式判別方法


判斷參數傳遞方式,不能單純的看過程定義中形參前的修飾限定詞有無byval。參數傳遞到底採用何種方式,不僅取決於過程定義,還取決於過程調用,即與對應實參的具體形式也有很大關係。因此,應該從以下三個方面綜合考慮:

1. 形參是否為數組或者控制項

2. 形參前是否有byval修飾

3. 對應實參是否為表達式或者值

具體判別方法,請見如下判別流程圖。

三、不同傳遞方式對參數類型的要求


若參數按地址傳遞,則vb要求實參的數據類型與形參的數據類型完全一致;若參數按值傳遞,則實參數據類型不要求與形參完全一致,但是必須能夠由vb默認轉化。


四、解題套用


(一) 以江蘇省計算機等級考試2001年春季的一道考題為例:


在應用程式中用“private function fun(x as integer, y as single)”定義了函式fun. 調用函式fun的過程中的變數i,j均定義為 integer型,能正確引用函式fun的是____

①fun(i,j) ②call fun(i,3.65)

③fun(3.14,234) ④fun(“245”, “231.5”)

a.①③ b.②③④ c.①②③ d.①②③④