編譯原理-四種引數傳遞方式
阿新 • • 發佈:2019-01-27
引數傳遞有傳名(call by name),傳值(call by value),傳地址(call by reference), 傳結果(call by result)等方式,
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------
傳地址: 所謂傳地址就是把實參的地址傳遞給相應的形參。在過程中每個形參對應一個單元,稱為形式單元。形式單元用來存放相應的實參地址。當呼叫一個過程時,呼叫段必須預先把實參的地址傳遞到一個被呼叫段可以得到的地方。如果實參是一個變數(包括下標變數),則直接傳遞它的地址。如果實參試常數或者其它表示式(如A+B)就先計算它的值並存放在某一臨時單元中。然後傳遞這個臨時單元的地址,當程式轉入被呼叫段之後,被呼叫段首先把實參地址抄進自己相應的形式單元中,過程體對形參的任何賦值都被處理成對形式單元的間接訪問(即對形勢單元中儲存的實參地址對實參進行訪問)。這樣,當被呼叫段的工作完畢進行返回時,實參單元已經持有所期望的值。
傳值:傳值是一種最簡單的引數傳遞方法。呼叫段把實參的值計算出來並存放在被呼叫段可以獲得的地方。被呼叫段開始工作時,將這個值拷貝到自己相應的形式單元中,就像使用區域性名一樣使用這些形式單元,即形參是如同一種先從實參獲得初值的區域性變數,獲得初值後就沒有聯絡了。這點與傳地址不同。
傳結果:和傳地址相思但不等價的另一種傳值方式是傳結果。這種方法的實質是形參具有兩個單元。第一個單元存放的實參的地址。第二個單元存放的實參的值,在過程中對形參的任何引用和賦值看成是對它的第二個單元的直接訪問。但是在呼叫返回之前必須把第二個單元的值存放到第一個單元指示的地址中。
傳名:傳名是ALGOL語言定義的一種特殊形式的形參結合方式。使用替換規則解釋傳名的引數的意義。過程呼叫的作用相當於把被呼叫的過程體抄到調用出現的地方,但把其中任何一個出現的形參都替換成相應的實參(文字替換)。如果在替換過程中出現了和區域性變數相同的標誌符,則使用不同的標識替換。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------
procedure P(X,Y,Z)
begin:
Y:=Y+1;
Z:=Z+X;
end P;
begin:
A:=2;
B:=3;
p(A+B,A,A);
Print A;
end
求程式的輸出
傳名:由於過程呼叫時被呼叫過程和形參均採用文字替換的形式,所以呼叫後的程式如下:
A:=2
B:=3
A:=A+1
A:=A+A+B
A = 3+3+3= 9
傳地址:使用T代表A+B,再使用動態分析
T = A+B = 2+3 =5(X)
A = 2 = 3(Y)= 8(Z)
傳結果:使用T代表A+B,再使用動態分析
X: T的地址 5
Y:A的地址 2 Y=Y+1 A的地址 3
Z:A的地址 2 Z=Z+X A的地址 7
執行結束後先將Y的值返回,A =3 ,再將 Z的地址返回,A=7。故A=7
傳值:A =2 因為和A沒啥關係
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
原文: