請教一個Procedure參數的問題 |
答題得分者是:xwing
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
各位前輩好,有時候我在看程式碼的時候,看到procedure大約會使用兩種宣告方式
一、procedure ForSample(X : String);
二、procedure ForSampleVar(var X : String);
請問兩者有何不同呢?
看了一下Help,好像是說
使用第一種方式的話,若procedure內部對傳入的參數作修改,不會影響到原本的值,而使用第二種的話,會去尋找其位址並且更動其值。
例如前面提到的兩個procedure內容是
X := X ' Just a Game';
假設某字串,StrSam := 'Life';
呼叫第一種方式,ForSample(StrSam),之後,StrSam的值仍舊是'Life'
呼叫第二種方式,ForSampleVar(StrSam),之後,StrSam的值就成為'Life Just a Game'
不知這樣的理解是否正確?
|
xwing
初階會員 發表:17 回覆:56 積分:44 註冊:2002-12-31 發送簡訊給我 |
引言: 各位前輩好,有時候我在看程式碼的時候,看到procedure大約會使用兩種宣告方式 一、procedure ForSample(X : String); 二、procedure ForSampleVar(var X : String); 請問兩者有何不同呢? 看了一下Help,好像是說 使用第一種方式的話,若procedure內部對傳入的參數作修改,不會影響到原本的值,而使用第二種的話,會去尋找其位址並且更動其值。 例如前面提到的兩個procedure內容是 X := X ' Just a Game'; 假設某字串,StrSam := 'Life'; 呼叫第一種方式,ForSample(StrSam),之後,StrSam的值仍舊是'Life' 呼叫第二種方式,ForSampleVar(StrSam),之後,StrSam的值就成為'Life Just a Game' 不知這樣的理解是否正確?是的.沒錯:P C 把它叫做 call by address 和call by value ForSample(StrSam) begin 在這function 的stack中是拷貝一份 傳入的參數 所以在這裏對它任意撕殺不會影響到該參數原本的值 當然在這函數內是有用的,它是分身 end; ForSampleVar(StrSam) begin 在這裏它就是本尊了,對這參數的動作直接影響到該參數在 記憶体中的位置 所以離開這函數之後,對該變數所做的影響還在:P end; ------------ 保持感恩的心..
------
------------ 我是瘦鵝... |
jian921
一般會員 發表:1 回覆:5 積分:1 註冊:2003-01-05 發送簡訊給我 |
pprayer 你好﹕
在我所學的[PASCAL語言程序設計]教材裡對這個問題是這麼說的﹕
形式參數分為數值參數與變量參數兩種。在參數標識符前無保留字VAR作前綴的參數是數值參數。它只在調用時把實際參數的值傳給形式參數﹐調用結束後並不把結果帶給實際參數﹐其信息只進不出﹐是一種入口參數。
在參數標識符前有保留字VAR作前綴的參數是變量參數。他在調用時相當與變量使用﹐把實際參數的值送給形式參數﹐調用結束後還把結果帶給實際參數﹐其信息有進有出。
由於形式參數的性質不同﹐因而提供實際參數的方式也有不同。與數值參數對應的實際參數必須向形式參數提供值﹐因此其形式允許是表達式﹑常量或一個變量(必須有值)。實際上﹐一個常量或一個變量(具有值)是最簡單的表達式。與變量對應的實際參數必須向形式參數提供變量單元﹐因此其形式只能是變量。(後有一經典例程﹐但我想不必搞得那麼羅嗦) 發表人 -
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |