故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。...

46
1/46 函函 函函 故故故故故 故故故故故 故故故故故 故故故故故 故故故故故故 故故故 ,,,,, 故故故故故 故故故故故 故故故故故 故故故故故 故故故故故故 故故故 ,,,,, 故故 故故故故故故故 故故故故故故 故故故故故故 ,。,。 故故 故故故故故故故 故故故故故故 故故故故故故 ,。,。 故故故故故故故故 故故故故故故故故 故故故故故故故故故故故故故 故故故故故故故故故故故故故 (modularized progra (modularized progra mming) mming) 故故故故故故 故故故故故故故故故故故故故故故故故故故 故故故故故故 故故故故故故故故故故故故故故故故故故故 故故 故故故故故故故 故故 故故故故故故故 (function) (function) 故故故 故故故故故 故故故 故故故故故 故故故故 故故故故故故故故故故 故故故故故故故故故故 ,,。 故故故故 故故故故故故故故故故 故故故故故故故故故故 ,,。 6

Upload: roy

Post on 07-Jan-2016

116 views

Category:

Documents


3 download

DESCRIPTION

6. 函數. 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇 》 函數的使用是模組化程式寫作 (modularized programming) 的重要方式。我們也可以把許多重要的資料處理程序區分出來,分別包裝成函數 (function) 的型式,獨立進行開發和測試,再以呼叫的方式使用,降低程式開發的難度。. 函數. 6.1 函數的基本概念 6.2 以參照的方式呼叫 6.3 inline 函數 6.4 變數的適用範圍和生存期間. 使用函數的目的. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

1/46

函數函數故用兵之法,十則圍之,五則攻之,倍則分之,故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 小敵之堅,大敵之擒也。

《孫子兵法﹒謀攻篇 》《孫子兵法﹒謀攻篇 》函數的使用是模組化程式寫作 函數的使用是模組化程式寫作 (modularized (modularized programming) programming) 的重要方式。我們也可以把許的重要方式。我們也可以把許多重要的資料處理程序區分出來,分別包裝成多重要的資料處理程序區分出來,分別包裝成函數 函數 (function) (function) 的型式,獨立進行開發和的型式,獨立進行開發和測試,再以呼叫的方式使用,降低程式開發的測試,再以呼叫的方式使用,降低程式開發的難度。 難度。

6

Page 2: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

2/46

函數 6.1  函數的基本概念

6.2  以參照的方式呼叫

6.3   inline 函數

6.4  變數的適用範圍和生存期間

Page 3: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

3/46

使用函數的目的

減少重複撰寫類似功能的程式

易於除錯和維護

Page 4: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

4/46

函數的語法 呼叫函數 (calling function)

被呼叫函數 (called function) 函數的語法可以分為下列三個部份:

1.函數的宣告

2.函數的定義

3.函數的呼叫

Page 5: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

5/46

範例程式 TempConv.cpp 是一個使用自定函數的簡單程式 (1/3)// TempConv.cpp

#include <math>

#include <iostream>

using namespace std;

// --- 函數 C2F () 的宣告 ------------------------

double C2F (double) ;

Page 6: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

6/46

範例程式 TempConv.cpp 是一個使用自定函數的簡單程式 (2/3)

//------ 主程式 -------------------------------int main () { double CTemp; cout << " 攝氏 華氏 " << endl ; cout << "-----------------" << endl ; for ( int i = 1 ; i <= 10 ; i++ ) { CTemp = 10.0*i; cout << setw (5) << CTemp << " " << setw (5) << C2F (CTemp) << endl ; } cout << "-----------------" << endl ; return 0;}

Page 7: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

7/46

範例程式 TempConv.cpp 是一個使用自定函數的簡單程式 (3/3)// -------- 函數 C2F () 的定義

-------------------double C2F (double C) { double F; F = C*9.0/5.0 + 32.0; return F;}

Page 8: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

8/46

程式 TempConv.cpp 操作結果 攝氏 華氏

-------------10 5020 6830 8640 10450 12260 14070 15880 17690 194100 212

-------------

Page 9: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

9/46

使用函數的示意圖

Page 10: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

10/46

函數原型 函數原型的通式為:

返回資料型態 函數名稱 ( 參數資料型態列 ) ; 其中的小括號 ()稱為函數呼叫運算子 (func

tion call operator) 以下列出幾種常見的函數原型:

int Warning () ; int MaxInt (int, int, int) ;int Area (int width, int Length) ; Area_2 (int, int) ;void Swap (double x, double y) ;

Page 11: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

11/46

函數的定義 (definition of a function)

將函數處理資料的細節寫成程式

函數一旦完成定義就可以隨時呼叫使用

不可以把函數的定義置於另一個函數的定義內

Page 12: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

12/46

函數定義的語法 (1/2)

返回資料形態 函數名稱 ( 參數列 )

{

主體敘述 函數的本體 return 傳回值 ;

}

// 函數的標頭列

Page 13: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

13/46

函數定義的語法 (2/2)

double C2F(double C) // 函數的標頭列{

double F;

F = C*9.0/5.0 + 32.0; 函數的本體 return F;

}

簡化的函數定義 double C2F(double C){ return C*9.0/5.0 + 32.0; }

Page 14: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

14/46

函數的呼叫 可以分為下列兩類:

1. 只用函數名稱及函數呼叫運算子 () 以及呼叫運 算子內的引數,自成一個完整的敘述。例如:

swap (a, b) ; 2. 將函數的呼叫放在適合該資料型態的敘述中:

N = MaxInt (P, q, r) ;M = 2.5 * Area (W,L) ;cout << "Temperature is" << C2F (Temp)

<< “ Fahrenheit” << endl;

Page 15: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

15/46

傳值呼叫 (call by value): 函數引數的傳遞方式

int main()

{

cout << C2F(CTemp);

return 0;

}

double C2F(double C) { double F; F = C*9.0/5.0 + 32.0;

return F; }

○1

○2

○3 ○4

stack

Page 16: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

16/46

不使用函數原型( prototype )的語法

如果把函數定義置於函數原型的位置 ( 亦即在

main() 之前 ) ,則此函數定義就兼具宣告和定

義的功能,不需要再使用函數原型

Page 17: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

17/46

範例程式 TempConv2.cpp ( 不使用函數原型 ) (1/2)

// TempConv2.cpp#include <iomanip>#include <iostream>using namespace std;double C2F (double C) //函數 C2F()的定義,兼具

宣告的功能{ double F; F = C*9.0/5.0 + 32.0; return F;}

Page 18: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

18/46

範例程式 TempConv2.cpp ( 不使用函數原型 ) (2/2)

//----- 以下為主程式 -------------------int main () { double CTemp; cout << " 攝氏 華氏 " << endl ;  cout << "-----------------" << endl ; for ( int i = 1 ; i <= 10 ; i++ ) { CTemp = 10.0*i; cout << setw (5) << CTemp << " " << setw (5) << C2F (CTemp) << endl ; } cout << "-----------------" << endl ; return 0; }

Page 19: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

19/46

範例程式 SeasonsFnc.cpp: 函數內「 return 敘述」的功能 (1/2)

// SeasonsFnc.cpp#include <iostream>using namespace std;// 以下為函數 CheckSeason () 的宣告void CheckSeason (int) ;//------ 主程式 ---------------------------------int main () { int M; cout << "\n" << "請輸入一個月份 : " << endl; cin >> M; CheckSeason (M) ; return 0;}

Page 20: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

20/46

範例程式 SeasonsFnc.cpp: 函數內「 return 敘述」的功能 (2/2)

// --- 以下為函數 CheckSeason () 的定義 ------------void CheckSeason (int Month) { if (Month < 1 || Month >12) { cout << "您輸入的月份沒有意義 !"; return; } cout << "\n" << Month << "月是 "; switch ( (Month%12) /3) { case 0: cout << "冬季 " << endl; break; case 1: cout << "春季 " << endl; break; case 2: cout << "夏季 " << endl; break; case 3: cout << "秋季 " << endl; break; default: cout << "程式有問題 !" << endl; } return;}

Page 21: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

21/46

參照 (reference)

參照是同一個變數的別名 (alias)例如:

int N; int& M = N;

這裏 & 稱為參照運算子 (reference operator) ,表示 M 和 N 所代表的變數位於同一個位址上。這個定義參照的敘述也可以寫成:

int &M = N;

Page 22: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

22/46

範例程式 TempConv3.cpp : 以參照的方式呼叫( call by reference ) (1/

2) // TempConv3.cpp

#include <iomanip>

#include <iostream>

using namespace std;

 

void C2F (double, double&) ; // 函數 C2F () 的原型

Page 23: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

23/46

範例程式 TempConv3.cpp : 以參照的方式呼叫( call by reference ) (2/2)

int main () { double CTemp, FTemp; cout << " 攝氏 華氏 " << endl ; cout << "-----------------" << endl ; for ( int i = 1 ; i <= 10 ; i++ ) { CTemp = 10.0*i; C2F (CTemp, FTemp) ; cout << setw (5) << CTemp << " " << setw (5) << FTemp << endl ; } cout << "-----------------" << endl ; return 0;}//-------- 函數 C2F () 的定義 ---------------------void C2F (double C, double& F) { F = C*9.0/5.0 + 32.0; return;}

Page 24: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

24/46

範例程式 Swap.cpp: 利用參照來交換兩個變數的值 (1/

2)// Swap.cpp#include <iostream>using namespace std; void Swap (int&, int&) ;void SWAP2 (int, int) ; int main () { int A = 5, B = 10; Swap (A, B) ; cout << "執行過 Swap () \n"; cout << " A 的值是: " << A << "\n B 的值是: " << B << endl; cout << endl;  SWAP2 (A, B) ; cout << "執行過 SWAP2 () \n"; cout << " A 的值是: " << A << "\n B 的值是: " << B << endl; }

Page 25: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

25/46

範例程式 Swap.cpp: 利用參照來交換兩個變數的值 (2/2)

//----------------------------------------void Swap (int& x, int& y) { int Temp; Temp = x; x = y; y = Temp;} //----------------------------------------void SWAP2 (int x, int y) { int Temp; Temp = x; x = y; y = Temp;}

Page 26: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

26/46

程式 Swap.cpp 操作結果

執行過 Swap () A 的值是: 10 B 的值是: 5執行過 SWAP2 () A 的值是: 10 B 的值是: 5

Page 27: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

27/46

參照的使用限制

參數本身必需改變

要傳回兩個以上的值

有大量參數需要傳遞

Page 28: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

28/46

inline 函數 在編譯時,其程式碼在每個呼叫的地方直接展開加入

Inline 函數的定義非常簡單,只要直接在函數的定義前加上關鍵字「 inline」就可以

Page 29: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

29/46

範例程式 Inline.cpp: 把函數 C2F () 改寫成 inline 函數 (1

/2)// Inline.cpp

#include <iomanip>

#include <iostream>

using namespace std;

// ---inline 函數 C2F () 的定義 -----------inline double C2F (double C)

{ return C*9.0/5.0 + 32.0; }

Page 30: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

30/46

範例程式 Inline.cpp: 把函數 C2F () 改寫成 inline 函數 (2

/2)//--------- 主程式 ---------------------int main () { double CTemp; int i; cout << " 攝氏 華氏 " << endl ; cout << "-----------------" << endl ; for ( i = 1 ; i <= 10 ; i++ ) { CTemp = 10.0*i; cout << setw (5) << CTemp << " " << setw (5) << C2F (CTemp) << endl ; } cout << "-----------------" << endl ; return 0;}

Page 31: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

31/46

inline 函數的使用時機

1. 函數本身非常簡短,但值得包裝起來使用

2. 函數被不同位置呼叫的次數不多時

Page 32: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

32/46

局部變數 (local variables)

在傳值的情況下,每一個函數都佔用自己獨

立的記憶體空間,函數內變數的工作空間不

會與其他函數的工作空間重疊,這些變數稱

為局部變數

Page 33: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

33/46

局部變數的三個儲存種類 (storage classes)

auto 是所有函數內變數的預設儲存方式,只在函數被呼叫時才存在,該函數結束後就消失

static局部變數並不隨函數呼叫結束而消失, static

變數的值保留上一次呼叫結束時的值

register 變數可以留在 CPU 內,提昇函數的執行速度

Page 34: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

34/46

範例程式 Local.cpp: 使用 auto 、static 和 register 三種局部變數 (1

/2)// Local.cpp#include <iostream>using namespace std;// ---函數 TestLocal () 的宣告 -------------------void TestLocal () ;// ------ 主程式 --------------------------------int main () { for (int i=1; i<=3; i++) { cout << "第 (" << i << ") 次: " << endl; TestLocal () ; cout << endl; } return 0;}

Page 35: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

35/46

範例程式 Local.cpp: 使用 auto 、 static 和 register 三種局部變數 (2/

2)// --- 函數 TestLocal () 的定義 ------------------void TestLocal () { int A = 1; static int S = 1; register int R = 1; cout << " A 的值是 " << A << endl; cout << " S 的值是 " << S << endl; cout << " R 的值是 " << R << endl; for (register int i=0; i<1000; i++) R += 2; cout << " 計算後 R 的值是 " << R << endl; A++; S++; R++; return;}

Page 36: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

36/46

操作結果 第 (1) 次: A 的值是 1 S 的值是 1 R 的值是 1 計算後 R 的值是 2001第 (2) 次: A 的值是 1 S 的值是 2 R 的值是 1 計算後 R 的值是 2001第 (3) 次: A 的值是 1 S 的值是 3 R 的值是 1 計算後 R 的值是 2001

Page 37: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

37/46

全域變數

如果把變數的宣告放在所有的函數之前,則

這些變數值變數稱為全域變數 (global variab

les) 可以讓其後的所有函數共用

Page 38: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

38/46

範例程式 Global.cpp 檢查全域變數的特性 (1/2)

// Global.cpp#include <iostream>using namespace std; int GLOBAL = 1, GLOBAL_2 = 7; //全域變數// ----- 函數 TestFnc () 的宣告 ------void TestFnc () ; // ------ 主程式 -------------------- int main () { int Local = 3; // 局部變數 GLOBAL = 9; cout << "GLOBAL 的值原來是: " << GLOBAL << endl; cout << "Local 的值原來是: " << Local << endl; cout << endl; TestFnc () ; cout << "呼叫 TestFnc () 之後 ." << endl; cout << "GLOBAL 的值目前是: " << GLOBAL << endl; cout << "Local 的值目前是: " << Local << endl; return 0; }

Page 39: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

39/46

// ---函數 TestFnc () 的定義 ------ void TestFnc () { int Local = 2; // 與主程式內變數同名的局部變數 int GLOBAL_2 = 20; // 與全域變數同名的局部變數 Local += 10; GLOBAL += 10; cout << "GLOBAL_2 的值是: " << GLOBAL_2 << endl; cout << ":: GLOBAL_2 的值是: " << :: GLOBAL_2 << endl; cout << endl;}

範例程式 Global.cpp 檢查全域變數的特性 (2/2)

Page 40: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

40/46

操作結果 GLOBAL 的值原來是: 9Local 的值原來是: 3GLOBAL_2 的值是: 20:: GLOBAL_2 的值是: 7呼叫 TestFnc () 之後 .GLOBAL 的值目前是: 19Local 的值目前是: 3

Page 41: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

41/46

extern 和 static 兩種全域變數

extern全域變數:宣告這個變數已經在其他檔案內定義過了

static全域變數:宣告這個全域變數只能在自己的檔案內才適用

Page 42: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

42/46

範例程式 ExtrenA.cpp : 探討各種全域變數儲存種類的特性 (1/3)

// ExternA.cpp#include <iostream>using namespace std; int Am, An; // 全域變數static int ASx, ASy; // static全域變數 // --- 函數的宣告 ------------------------void Func1 () ;void Func2 () ;void Func3 () ;

Page 43: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

43/46

範例程式 ExtrenA.cpp : 探討各種全域變數儲存種類的特性 (2/3)

// ------ 主程式 ------------------------int main () { cout << "執行過 Func1 () \n"; Func1 () ; cout << "Am 的值是: " << Am << endl; cout << "An 的值是: " << An << endl; cout << endl; cout << "執行過 Func2 () \n"; Func2 () ; cout << "Am 的值是: " << Am << endl; cout << "An 的值是: " << An << endl; cout << "執行過 Func3 () \n"; Func3 () ; return 0;}

Page 44: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

44/46

範例程式 ExtrenA.cpp : 探討各種全域變數儲存種類的特性 (3/3)extern int Bp; // extern 變數  //----- 函數 Fnc3 () 的定義 ----------------void Func3 () { cout << "Bp 的值是: " << Bp << endl; cout << endl;}

Page 45: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

45/46

範例程式 檔案 ExternB.cpp

// ExternB.cppint Bp; // 全域變數extern int Am; // extern變數 // --- 函數 Fnc1 () 的定義 -------------void Func1 () { Bp = 2; Am = 8;} // --- 函數 Fnc2 () 的定義 -------------void Func2 () { extern int An; Am += 10; An = 27;}

Page 46: 故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 《 孫子兵法 ﹒ 謀攻篇

46/46

操作結果 執行過 Func1 () Am 的值是: 8An 的值是: 0執行過 Func2 () Am 的值是: 18An 的值是: 27執行過 Func3 () Bp 的值是: 2