陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司.

Slides:



Advertisements
Similar presentations
工職數學 第四冊 第一章 導 數 1 - 1 函數的極限與連續 1 - 2 導數及其基本性質 1 - 3 微分公式 1 - 4 高階導函數.
Advertisements

變數與函數 大綱 : 對應關係 函數 函數值 顧震宇 台灣數位學習科技股份有限公司. 對應關係 蛋餅飯糰土司漢堡咖啡奶茶 25 元 30 元 25 元 35 元 25 元 20 元 顧震宇 老師 台灣數位學習科技股份有限公司 變數與函數 下表是早餐店價格表的一部分: 蛋餅 飯糰 土司 漢堡 咖啡 奶茶.
第一單元 建立java 程式.
第七章 副程式.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
新世代計算機概論 第14章 程式語言.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
第9章 运行时的存储组织 重点:符号表的内容、组织,过程调用实现, 难点:参数传递,过程说明语句代码结构,
陳維魁 博士 儒林圖書公司 第六章 領域與範圍 陳維魁 博士 儒林圖書公司.
Chapter 5 遞迴 資料結構導論 - C語言實作.
Chapter 5 迴圈.
Chapter 7 Subroutine and Function
第八章 符号表 符号表的作用: 一致性检查和作用域分析; 辅助代码生成..
第十一章 結構.
程式語言簡介.
簡易C++除錯技巧 長庚大學機械系
物件導向程式設計 (Object-Oriented rogramming)
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
C 程式設計— 指標.
C 程式設計— 指標 台大資訊工程學系 資訊系統訓練班.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
第六章 运行时存储空间的组织和管理 术语 本章内容 讨论一个活动记录中的数据布局 程序执行过程中,所有活动记录的组织方式 过程的活动
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
Chapter 7 指標.
講師:戴志華 國立台灣大學電機工程研究所 Visual Basic 程式設計 講師:戴志華 國立台灣大學電機工程研究所.
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
程式語言Visual Basic 傳址與傳值
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
Introduction to the C Programming Language
程式設計實習課(四) ----C 函數運用----
Topic Introduction—RMI
第一單元 建立java 程式.
|07 函數.
輸入&輸出 函數 P20~P21.
第十章 指標.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
CH05. 選擇敘述.
挑戰C++程式語言 ──第8章 進一步談字元與字串
第3 语言翻译问题 [学习目标]:学习和掌握语言的语法的基本概念和基本要素,理解翻译的步骤;学习和掌握BNF文法。
函數 博碩文化出版發行.
C qsort.
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
第九章 运行时存储空间组织 网上教学系统: : 编译原理
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
函數應用(二)與自定函數.
陣列與結構.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
實習八 函式指標.
第一章 直角坐標系 1-3 函數及其圖形.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Programming & Language Telling the computer what to do
Introduction to the C Programming Language
05 方法. 05 方法 5.1 方法 在一個較大型的程式中,通常會將具有特定功能或經常重複使用的程式,撰寫成獨立的小單元,稱為「方法」(Method),並賦予方法一個名稱,當程式需要時就可以呼叫此方法來執行該段特定程式。(此種重複使用的程式小單元在其他語言中可能稱為程序、副程式或函式, Visual.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
Array(陣列) Anny
Chapter 4 Multi-Threads (多執行緒).
陳維魁 博士 儒林圖書公司 第六章 領域與範圍 陳維魁 博士 儒林圖書公司.
ABC ( )已知 ,則下列哪些是x6-7x5-8x4 的因 式?(複選) (A) x+1 (B) 2x+2 (C) x3(x+1)
陳維魁 博士 儒林圖書公司 第八章 例外處理 陳維魁 博士 儒林圖書公司.
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司

大綱 副程式概念介紹 副程式基本觀念 參數傳遞的方法 別名 超荷法 通用性函數 六種常見的副程式呼叫方式 精選習題

副程式概念介紹 副程式的元素 副程式的名稱 參數 實際參數(actual parameter) 型式參數(formal parameter) 呼叫副程式的參數串列即稱為實際參數,又稱為真實參數。 型式參數(formal parameter) 被呼叫副程式的參數串列即稱為型式參數,又稱為虛擬參數(dummy parameter)

副程式概念介紹 副程式的元素 環境(environment) 副程式執行的程式段 由副程式執行時所參考的全域變數(global variable),區域變數(local variable)及其他必要的資訊構成 副程式執行的程式段

範例 program demo; var a1,a2 : integer; .... procedure swap(b1, b2:integer); var    temp: integer; begin    temp := b1;    b1 := b2;    b2 := temp end; begin    swap(a1, a2) end. 左例中swap(a1,a2)的參數串列(a1,a2)即為實際參數串列,副程式swap(b1,b2)中的參數串列(b1,b2)則為型式參數串列

型式參數的語意模型 型式參數的三種不同語意模型分別為 in mode out mode in out mode 型式參數可從對應的實際參數接收訊息。 out mode 型式參數可將訊息傳給對應的實際參數 in out mode 型式參數可從對應的實際參數接收訊息也可將訊息傳給對應的實際參數

實際與型式參數的對應關係 關鍵字對應法 位置對應法 參數的個數較多時適用 當參數的數目很多時,採用關鍵字對應法,程式的可讀性較高、較易維護不易出錯且可以不必按照特定順序 位置對應法 參數的個數較少時適用(通常是5個以下)

範例 ADA程式語言呼叫時 Procedure DRAW_AXES(X_ORI,Y_ORI,………) 呼叫方式 1. 位置對應法 2. 關鍵字對應法 DRAW_AXES(X_ORI=>500, Y_ORI=>500,…..)

副程式的執行模式 副程式的執行動作是因為呼叫程式呼叫了副程式所引起 當呼叫程式呼叫副程式時會將程式的控制流程轉移到副程式開始處 待副程式執行結束時會將程式的控制流程轉移到呼叫程式中呼叫副程式敘述的下一個敘述 副程式執行時可改變其所處的環境的狀態

副程式的執行模式 呼叫程式執行 呼叫sub( )副程式 控制流程轉移到sub( )副程式 sub( )副程式執行 呼叫程式繼續執行

副程式的種類 程序(procedure) 函式(function) 沒有傳回值 函式與程序類似,最大的不同之處是函式會傳回一個值 函式本身亦具有型態 函式也可作為運算式的一部分

求最大公因數 程式段 Pascal function gcd(a, b: integer):integer; begin if b = 0 then gcd := a else gcd := gcd(b, a mod b) end;

求最大公因數 程式段 C int gcd(a, b) int a, b; { if (b = = 0) return (a); else return (gcd(b, a%b)); }

參數傳遞的方法 常見參數傳遞的方法 傳值呼叫法 傳址呼叫法 傳名呼叫法 數值結果呼叫法 本文呼叫法

傳值呼叫法 (call by value) 呼叫程式呼叫被呼叫程式時,將呼叫程式中實際參數的值,傳給被呼叫程式中對應的型式參數 實際參數與相對應的型式參數不會佔用相同的記憶體空間 沒有副作用(side effect)-邊際效應 只提供 in mode 參數

傳值呼叫法 (call by value) 優點 缺點 實際參數的值只能被讀取,在副程式執行的過程中不會因為更改型式參數的值連帶地將實際參數的值更改 缺點 需配置額外的記憶體空間給型式參數使用

傳址呼叫法 (call by address) (傳參) 又稱為call by reference或call by location 呼叫程式呼叫被呼叫程式時,將呼叫程式中實際參數的位址,傳給被呼叫程式中對應的型式參數 實際參數與對應的型式參數會佔用相同的記憶體空間 有副效應-邊際效應 提供 in out mode 參數

傳址呼叫法 (call by address) 優點 不需配置額外的記憶體空間給型式參數使用 缺點 在副程式執行的過程中會因為更改型式參數的值連帶地將實際參數的值更改(副作用)

傳名呼叫法 (call by name) 呼叫程式呼叫被呼叫程式時,將呼叫程式中實際參數的名稱,傳給被呼叫程式中對應的型式參數 將副程式中所有型式參數的名稱以實際參數的名稱來替代 實際參數與對應的型式參數會佔用相同的記憶體空間

傳名呼叫法 (call by name) 優點 缺點 具有較大的彈性,可提供不同型式的實際參數讓同一個副程式做不同的工作 當實際參數為簡單變數時,傳名呼叫法之處理方式與傳址呼叫法相同 當實際參數為常數時,傳名呼叫法之處理方式與傳值呼叫法類似 缺點 程式難讀、不易製作、執行速度較慢及不易學習

數值結果呼叫法 (call by value result) 呼叫程式呼叫被呼叫程式時,將呼叫程式中實際參數的值,傳給被呼叫程式中對應的型式參數 實際參數與型式參數不會佔用相同的記憶體位置 當被呼叫程式執行完畢時,會將被呼叫程式中型式參數的值,傳回給呼叫程式中對應的實際參數 提供 in out mode 參數

範例 設有一程式語言的副程式如下: PROCEDURE P(A,B,C); B=C; RETURN(A+C); END; 若X=1,Y=2,試問執行"R←P(X,X,X+Y)"之後對於 (a)傳名呼叫法 (b)傳值呼叫法 (c)傳址呼叫法三種不同的參數傳送的方式,R之值各為若干?

Ans (a) 傳名呼叫:8 佔用相同的憶體空間。 副程式中的參數及指令中的變數都用主程式的參數取代。 PROCEDURE P(X,X,X+Y); 把名稱替換掉並且計算 B=C; -> X=X+Y=3 RETURN(A+C); -> A+C=>X+X+Y=3+3+2=8 END; (b) 傳值呼叫:4 X=1,Y=2 P(X,X,X+Y) A=1 C=3 傳回1+3=4 (c) 傳址呼叫:6 同位址參數放同位置,每個都列出來

範例 若右例以: (a)傳名呼叫法 (b)傳值呼叫法 (c)傳址呼叫法 (d)數值結果呼叫法 四種不同的引數傳送的方式,A之值各為若干? procedure P(X,Y,Z); begin Y:=Y+1; Z:=X+X; end; begin A:=1; B:=1; P(A+B,A,A); print A; end.

Ans A:=1; B:=1; P(A+B,A,A);執行函數 (a)傳名呼叫法 Y:=Y+1; 以參數換掉A:=A+1 A值為2 Z:=X+X; A:=A+B+A+B=6 A值為6 (b)傳值呼叫法 所有參數分開看 A:=1; B:=1; P(A+B,A,A);執行P(2,1,1) 此時X=2, y=1 ,z=1 Y:=Y+1 =2 Z:=X+X=4 此時A還是1

(c)傳址呼叫法 A:=1; B:=1; P(A+B,A,A); 執行P(X,Y,Z) 此時X=2, Y=Z=A=1同位址 Y:=Y+1; 此時Y=Z=A=2 Z:=X+X; 此時Y=Z=A=2+2 數值結果呼叫法 將值傳到函數執行 P(2,1,1) 此時X=2, y=1 ,z=1 執行Y:=Y+1 =2 Z:=X+X=4 傳回(2,2,4)=>P(A+B,A,A) A如果取第二個是2,取第三個是4

本文呼叫法 (call by text) 在呼叫時不把實際參數閉合(closure),而是一直延遲到遇到型式參數時再予閉合 用被呼叫程序環境閉合時的狀態計算實際參數之值 “閉合”是指一程序與其相關環境繫結在一起之過程 LISP之FEXPR版本採用此法 和傳名呼叫類似,但是名稱相同時候先用區域參用環境的變數結合,沒有定義的話才會與實際參數結合

本文呼叫法範例 名稱相同時候先用區域參用環境的變數結合,沒有定義的話才會與實際參數結合 var x : integer; procedure text(y); var x : integer; begin x := 5; writeln(y); end; begin x:=4; text(x); end. 本文呼叫法處理結果為 5 傳名呼叫法處理則結果為 4 名稱相同時候先用區域參用環境的變數結合,沒有定義的話才會與實際參數結合

別名 (aliasing) 兩個或兩個以上名稱不同的變數,佔用相同的記憶體空間 別名形成的原因 參數傳遞時採用傳址呼叫法 變異記錄(variant record) 指標 Fortran的“equivalence”敘述

別名 現象對程式執行結果的影響 已知某一算術運算式(arithmetic expression):A×FUN(A)+A 若執行此運算式前之A值為2,FUN(A)傳回值為3,而執行此運算式時由於副作用(Side effect)造成A值變成6,則下列何者不可能是此運算式執行後之值? (A) 20 (B) 24 (C) 12 (D) 10

由左至右A×FUN(A)+A 2*3+6=12 由右至左A×FUN(A)+A 6*3+2=20 先導入A值 2*3+2=8 先執行副程式 6*3+6=24 如果沒有邊際效應則運算都是2*3+2=8

超荷法 (overloading) 如果結構(constructure),因為引數的型態不同而具有不同的意義的話,則稱此現象為超荷法 範例 A+B 若A,B為整數則執行整數加法運算;若A,B為實數則執行實數加法運算

Abs=(real A) real: if A<0 then –A else A fi Algol68中關於ABS()函數 有三種定義 Abs=(real A) real: if A<0 then –A else A fi ABS=(int B) int: if B<0 then –B else B fi ABS=(long real C) long real: if C<0 then –C else C fi

Double min (double A, double B) { return (A<B)? A:B; } C++ Double min (double A, double B) { return (A<B)? A:B; } Int min (int C, int D) return (C<D)? C:D; 型態不同時候,使用的函數也不同

通用性函數 (generic function) 允許參數傳遞的對象為“型態” 主要的用途是可排除程序對資料型態的依賴性 優點 可減少程式碼的長度 可減少撰寫程式時,發生錯誤的可能性 代表性的語言是ADA 型態改變時候,可以根據傳遞型態,同個函數可以根據參數,處理不同型態

ADA 通用性函數範例 generic type T is private; package P is procedure SWAP (A, B: in out T); end P; package body P is procedure SWAP (A, B: in out T) is temp : T; begin temp := A; A := B; B := temp; end; end P;

ADA 通用性函數範例 procedure SWAPINT is new SWAP (integer); procedure SWAPINT(A,B:in out integer) is    temp : integer; begin       temp:=A;A:=B;B:=temp; end;

ADA 通用性函數範例 procedure SWAPINT is new SWAP (real); procedure SWAPINT(A,B:in out real) is    temp : real; begin       temp:=A;A:=B;B:=temp; end;

六種常見的副程式呼叫方式 呼叫∕返回副程式(call∕return subroutine) 遞迴副程式(recursive subroutine) 例外處理副程式(exception handling subroutine) 並行常式(coroutine) 排程副程式(scheduled subroutine) 並行程序(concurrent subroutine)

呼叫∕返回副程式 與一般的副程式呼叫是相同的 傳統的呼叫/返回副程式須滿足以下五項限制 不允許遞迴呼叫 副程式被呼叫時,必須有明顯的呼叫敘述 副程式被呼叫時,應從頭開始執行 副程式被呼叫時,控制流程應立即轉移 單一執行順序

遞迴副程式 若副程式可以呼叫本身或透過其他的副程式來呼叫本身 直接遞迴 間接遞迴 副程式可以自己呼叫自己 副程式可以透過其他的副程式來呼叫自己

例外處理副程式 處理例外情況的副程式 首創例外處理的語言為 PL/1

並行常式 一種交換關係 假設有二個程序分別是P與Q,其中程序P可以啟動Q的執行,而程序Q也可以啟動程序P的執行 當程序啟動另一程序的執行時,會先將自己目前的狀態儲存起來,下次被啟動執行時,會由上次執行結束之處繼續往下執行,而非從頭開始執行

排程副程式 一般的副程式呼叫是在被呼叫時,立即執行副程式 排程副程式在被呼叫時,並未立即被執行而是須在符合某種條件下才會被啟動執行 範例 CALL SUB AT TIME=100 代表當時間為100時,副程式SUB才會被啟動。 CALL SUB1 AFTER SUB2 代表當副程式SUB2執行完畢後,副程式SUB1才會被啟動

並行程序 同時執行的程式段即稱為並行程序

練習 傳名呼叫法、傳值呼叫法及傳址呼叫法在資訊定址值方面有早晚之分,試列出早晚的順序。

Ans 資訊定址值方面之速度以傳址呼叫法最快、傳名呼叫法次之而傳值呼叫法則是最慢。

練習 假設我們要得到下列控制結構(control structure)則必須分別從單純的呼叫/回歸(simple call-return)方式中放鬆那些限制? (1) 遞迴程序(recursive procedure) (2) 互動程序(coroutine) (3) 排程化的副程式(scheduled subprogram) (4) 平行的副程式(concurrent subprogram)

Ans (1) 不允許遞迴呼叫。 (2) 副程式被呼叫時,應從頭開始執行。 (3) 副程式被呼叫時,控制流程應立即轉移。 (1) 不允許遞迴呼叫。 (2) 副程式被呼叫時,應從頭開始執行。 (3) 副程式被呼叫時,控制流程應立即轉移。 (4) 單一執行順序。

練習 請就以下不同的實際參數對傳值呼叫法及傳址呼叫法的效果為何? (1) 簡單變數(Simple variable)。 (2) 常數(Constant)。 (3) 運算式(Expression)。 (4) 指數為常數的陣列元素。 (5) 指數為運算式的陣列元素。 (6) 陣列。

Ans 傳值呼叫 傳址呼叫 簡單變數 傳此簡單變數之值 傳此簡單變數之位址 常 數 傳此常數之值   傳值呼叫 傳址呼叫 簡單變數 傳此簡單變數之值 傳此簡單變數之位址 常  數 傳此常數之值 配置一個記憶體空間給此常數, 傳該記憶體空間之位址 運 算 式 計算運算式之值,傳此值 計算運算式之值,配置一個記 憶體空間給此值,傳該記憶體 空間之位址 指數為常數 的陣列元素 求得陣列元素之值,傳此 值 求得陣列元素之位址,傳此位 址 指數為運算式 的陣列元素 陣  列 通常不允許 傳陣引之起始位址

練習 試問在Java語言中,函數之間的參數如何傳遞?

Ans (1) 傳值呼叫法(call by value): 若參數之型態若為語言本身所提供的資料型態,則採用傳值呼叫法來處理參數傳遞之問題。 (2) 傳址呼叫法(call by reference): 若參數為物件、陣列等型態,則可提供傳址呼叫法之效果來處理參數傳遞之問題。

練習 定義N!=N*(N-1)*(N-2)*… *2*1 例如5!=5*4*3*2*1=120 (1) 請利用Recursion的方式寫出一程式PA來計算N! (2) 請利用迴圈(Loop structure)的方式改寫PA立另一程式為PB (3) 比較PA和PB兩程式的執行效率為何?

Ans (1) int PA(int N) { if (N = = 1) return(1); else return (N*PA(N-1)); } (2) PB: f=1; for (I=2; I<=N; I++) f = f * I; (3) PB效率較佳,因為採用非遞迴方式處理程式段。

練習 以下仿C語言語法之主、副程式而言: (一) 如果所有的參數都是採用傳值呼叫法,寫出執行後所印製之結果並說明其理由。 (一) 如果所有的參數都是採用傳值呼叫法,寫出執行後所印製之結果並說明其理由。 (二) 如果所有的參數都是採用傳址呼叫法,寫出執行後所印製之結果並說明其理由。 /* main program */ /* subprogram */ mainO swap(a, b:integer) {int i,j; {int temp; i=3; j=5 temp=a; Swap(3,j); a=b; Printf("%d,"3*i+j); b=temp; } }

Ans 採用“call by value”: 輸出結果為3×i+j=3×3+5=14。 採用“call by reference”: j,b 5 a i 3 j,b a 5

練習 考慮底下以類似Pascal語言語法所定義的二函數副程式: function A(I,K: integer):integer;  begin     if I=0 then        A : =1     Else        A : = K  end;  function B(X: integer) : integer ;  begin     B : = A(X, X * B(X-1))  end; 試以傳值呼叫法方式來計算B(5)的結果。

Ans B = 5*B(4) =5*4*B(3)=5*4*3*B(2) = 5*4*3*2*B(1)=5*4*3*2*1*B(0) = 5*4*3*2*1*1 (∵B(0)=1) 所以,結果為120

練習 就執行下列仿語言語法之程式,舉出兩種可能印出的答案,並提出合理的語意說明。 int fun(int *k) {*k + = 2; return 2*(*k) +1; } void main( ) {int i = 10, dat; dat = fun(&i) + i; printf(“%d”, dat); }

Ans 由於副作用之影響,若“dat=fun(&i)+i;”敘述採用左結合性求值,則結果為37;但若“dat=fun(&i)+i;”敘述採用右結合性求值,則結果為31。

練習 以下Pascal程式倘若有參數傳遞 (1) 採數值結果呼叫法則結果為何? (2) 採引用呼叫法則結果為何? (1) 採數值結果呼叫法則結果為何? (2) 採引用呼叫法則結果為何? program param(input, output); var a, b :integer; procedure p(x, y: integer); begin x := x+2; a := x×y; x := x+1; end; begin a:=1; b:=2; p(a, b); writeln(a); end.

Ans 數值結果呼叫法:a. 須額外配置記憶體空間給副程式中之型式參數。 b. 副程式執行完後,將副程式之型式參數串列結果值傳回給對應的主程式實際參數。其作法如下: 引用呼叫法:

練習 執行下列的程式,寫出結果。 program House(output); var thing : integer; procedure Cheat(var hee, haw : integer); begin hee := -1; haw := -hee; end; begin thing := 1; Cheat(thing, thing); writeln(thing); end. Pascal程式,由於Subroutine中,型式參數以“var”宣告故採用傳址呼叫法。

Ans 結果為1

練習 考慮以下程式片段: void main() { int value=2,list=5; swap(value,list); } void swap(int a, int b){ int temp; temp=a; b=temp; } (1) 若參數傳遞為以值傳遞,則在main()執行完swap(value,list)之後,變數value,list之值各為多少? (2) 若參數傳遞為以址傳遞,則在main()執行完swap(value,list)之後,變數value,list之值各為多少?

ANS 採用call by value法,作法如下: 所以,執行完swap(value,list)後,value=2,list=5。 採用call by address法,作法如下: 所以,執行完swap(value,list)後,value=2,list=2。

練習 有一程式如下: program parms(output); Var i, j : integer; a : array[1..4] of integer; procedure P(x, y : integer); begin i:=i+1; j:=j+1; writeln(x, y); x:=x+1; y:=y+1 end; begin for i:=1 to 4 do a〔i〕:= i; i:=1; j:=2; P(a[j], a[i]); writeln(i, j, a[1], a[2], a[3], a[4]) end 請問以(1)Call by reference (2)Call by value (3)Call by name法傳遞參數,程式執行結果為何?

Ans (1) call by reference:傳址 21 232334 (2) call by value: 21 231234 (3) call by name:傳名 32 231344

練習 假設有一ALGOL-LIKE程式片段如下,請依以下所列之各種參數傳遞方式分別寫出此程式片段之執行結果。 (1) Call by value (2) Call by address (3) Call by name (4) Call by value-result program Parm(output); var x: integer; procedure sub(exp, I : integer) begin I := exp; I := exp; end; begin /* main program */ x := 3; sub(2*x, x); print(x); end.

Ans (1) Call by value: ∴結果為3 (2) Call by address: ∴結果為6

Ans 3) Call by name: a. 名稱對應關係:exp=>2*x, I=>x b. 名稱替換:I:=exp=>x:=2*x, I:=exp=>x:=2*x c. 執行: ∴結果為12 (4) Call by value-result: ∴結果為6

練習 對應參數的位址方法,若以應用於下列程式片段,試問值為何? Main real L,M,N L=5 M=2 N=S(L,2L,L+2M) Output N End(Main) S:sub(X,Y,Z) real X,Y,Z,W Y=Z W=Y+Z return(W) end(sub)

Ans