chap 6 函數

46
1 1 /46 /46 Chap 6 Chap 6 函函 函函 故故故故故 故故故故故 故故故故故 故故故故故 ,,,, 故故故故故 故故故故故 故故故故故 故故故故故 ,,,, 故故故故故 故故故故故故 故故故故故故故 ,,。 故故故故故 故故故故故故 故故故故故故故 ,,。 故故故故故 故故故故故故 ,。 故故故故故 故故故故故故 ,。 故故故故故故故故 故故故故故故故故 故故故故故故故故故故故故故 故故故故故故故故故故故故故 (modularized programming) (modularized programming) 故故故故故故 故故故故故故 故故故故故故故故故故故故故故故故故故故故故 故故故故故故故 故故故故故故故故故故故故故故故故故故故故故 故故故故故故故 (function) (function) 故故故 故故故 故故故故故故故故 故故故故故故故故故故 故故故故故故故故故故 ,,。 故故故故故故故故 故故故故故故故故故故 故故故故故故故故故故 ,,。

Upload: aolani

Post on 07-Jan-2016

66 views

Category:

Documents


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Chap 6   函數

11/46/46

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

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

Page 2: Chap 6   函數

22/46/46

函數函數

6.16.1   函數的基本概念 函數的基本概念

6.26.2   以參照的方式呼叫以參照的方式呼叫

6.36.3    inlineinline 函數函數

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

Page 3: Chap 6   函數

33/46/46

使用函數的目的使用函數的目的

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

易於除錯和維護 易於除錯和維護

Page 4: Chap 6   函數

44/46/46

函數的語法 函數的語法

呼叫函數呼叫函數 (calling function)(calling function)

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

1.1. 函數的宣告函數的宣告

2.2. 函數的定義函數的定義

3.3. 函數的呼叫函數的呼叫

Page 5: Chap 6   函數

55/46/46

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

// TempConv.cpp// TempConv.cpp

#include <math>#include <math>

#include <iostream>#include <iostream>

using namespace std;using namespace std;

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

double C2F (double) ; double C2F (double) ;

Page 6: Chap 6   函數

66/46/46

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

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

Page 7: Chap 6   函數

77/46/46

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

// -------- // -------- 函數函數 C2F () C2F () 的定義的定義 --------------------------------------

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

Page 8: Chap 6   函數

88/46/46

程式 程式 TempConv.cpp TempConv.cpp 操作結果 操作結果

攝氏 華氏-------------

10 5020 6830 8640 10450 12260 14070 15880 17690 194100 212

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

Page 9: Chap 6   函數

99/46/46

使用函數的示意圖使用函數的示意圖

Page 10: Chap 6   函數

1010/46/46

函數原型函數原型

函數原型的通式為:函數原型的通式為:返回資料型態返回資料型態 函數名稱函數名稱 (( 參數資料型態列參數資料型態列 )) ;;

其中的小括號其中的小括號 ()() 稱為函數呼叫運算子稱為函數呼叫運算子 (function call operator)(function call operator)

以下列出幾種常見的函數原型:以下列出幾種常見的函數原型:int Warning () ;int Warning () ; int MaxInt (int, int, int) ;int MaxInt (int, int, int) ;int Area (int width, int Length) ;int Area (int width, int Length) ; Area_2 (int, int) ;Area_2 (int, int) ;void Swap (double x, double y) ;void Swap (double x, double y) ;

Page 11: Chap 6   函數

1111/46/46

函數的定義函數的定義 (definition of a function)(definition of a function)

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

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

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

定義內定義內

Page 12: Chap 6   函數

1212/46/46

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

返回資料形態返回資料形態 函數名稱函數名稱 (( 參數列參數列 ) // ) // 函數的標頭列函數的標頭列 {{

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

}}

Page 13: Chap 6   函數

1313/46/46

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

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

double F;double F;

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

}}

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

Page 14: Chap 6   函數

1414/46/46

函數的呼叫函數的呼叫

可以分為下列兩類:可以分為下列兩類: 1.1. 只用函數名稱及函數呼叫運算子只用函數名稱及函數呼叫運算子 () () 以及呼叫運以及呼叫運

算子內的引數,自成一個完整的敘述。例如:算子內的引數,自成一個完整的敘述。例如: swap (a, b) ;swap (a, b) ;

2.2. 將函數的呼叫放在適合該資料型態的敘述中:將函數的呼叫放在適合該資料型態的敘述中: N = MaxInt (P, q, r) ;N = MaxInt (P, q, r) ;

M = 2.5 * M = 2.5 * Area (W,L)Area (W,L) ; ;

cout << "Temperature is" << C2F (Temp) cout << "Temperature is" << C2F (Temp)

<< “ Fahrenheit” << endl; << “ Fahrenheit” << endl;

Page 15: Chap 6   函數

1515/46/46

傳值呼叫傳值呼叫 (call by value): (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: Chap 6   函數

1616/46/46

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

如果把函數定義置於函數原型的位置如果把函數定義置於函數原型的位置

(( 亦即在亦即在 main() main() 之前之前 )) ,則此函數定義,則此函數定義

就兼具就兼具宣告宣告和和定義定義的功能,不需要再使的功能,不需要再使

用函數原型用函數原型

Page 17: Chap 6   函數

1717/46/46

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

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

能能{ double F;{ double F; F = C*9.0/5.0 + 32.0;F = C*9.0/5.0 + 32.0; return F;return F;}}

Page 18: Chap 6   函數

1818/46/46

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

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

Page 19: Chap 6   函數

1919/46/46

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

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

Page 20: Chap 6   函數

2020/46/46

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

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

Page 21: Chap 6   函數

2121/46/46

參照參照 (reference)(reference)

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

int N; int N;

int& M = N;int& M = N; 這裏這裏 && 稱為稱為參照運算子參照運算子 (reference operator)(reference operator) ,,

表示表示 MM 和和 NN 所代表的變數位於同一個位址上。所代表的變數位於同一個位址上。這個定義參照的敘述也可以寫成:這個定義參照的敘述也可以寫成:

int &M = N;int &M = N;

Page 22: Chap 6   函數

2222/46/46

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

// TempConv3.cpp// TempConv3.cpp

#include <iomanip>#include <iomanip>

#include <iostream>#include <iostream>

using namespace std;using namespace std;

  

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

Page 23: Chap 6   函數

2323/46/46

範例程式 範例程式 TempConv3.cpp : TempConv3.cpp : 以參照的方式呼叫(以參照的方式呼叫( call by referencecall by reference )) (2/(2/2)2)int main () int main () {{ double CTemp, FTemp;double CTemp, FTemp; cout << " cout << " 攝氏攝氏 華氏華氏 " << endl ;" << endl ; cout << "-----------------" << endl ;cout << "-----------------" << endl ; for ( int i = 1 ; i <= 10 ; i++ ) for ( int i = 1 ; i <= 10 ; i++ ) {{ CTemp = 10.0*i;CTemp = 10.0*i; C2F (CTemp, C2F (CTemp, FTemp) ;FTemp) ; cout << setw (5) << CTemp << " "cout << setw (5) << CTemp << " " << setw (5) << FTemp << endl ;<< setw (5) << FTemp << endl ; }} cout << "-----------------" << endl ;cout << "-----------------" << endl ; return 0;return 0;}}//-------- //-------- 函數函數 C2F () C2F () 的定義的定義 ------------------------------------------voidvoid C2F (double C, C2F (double C, double& Fdouble& F) ) {{ FF = C*9.0/5.0 + 32.0; = C*9.0/5.0 + 32.0; return;return;}}

Page 24: Chap 6   函數

2424/46/46

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

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

Page 25: Chap 6   函數

2525/46/46

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

//----------------------------------------//----------------------------------------void void SwapSwap (int (int&& x, int x, int&& y) y) {{ int Temp;int Temp; Temp = x; Temp = x; x = y;x = y; y = Temp; y = Temp;}}  //----------------------------------------//----------------------------------------void void SWAP2SWAP2 (int x, int y) (int x, int y) {{ int Temp;int Temp; Temp = x; Temp = x; x = y;x = y; y = Temp; y = Temp;}}

Page 26: Chap 6   函數

2626/46/46

程式 程式 Swap.cpp Swap.cpp 操作結果 操作結果 執行過 Swap () A 的值是: 10 B 的值是: 5執行過 SWAP2 () A 的值是: 10 B 的值是: 5

Page 27: Chap 6   函數

2727/46/46

參照的使用限制參照的使用限制

參數本身必需改變參數本身必需改變

要傳回兩個以上的值要傳回兩個以上的值

有大量參數需要傳遞有大量參數需要傳遞

Page 28: Chap 6   函數

2828/46/46

inline inline 函數函數

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

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

Page 29: Chap 6   函數

2929/46/46

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

(1/2)(1/2)

// Inline.cpp// Inline.cpp

#include <iomanip>#include <iomanip>

#include <iostream>#include <iostream>

using namespace std;using namespace std;

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

inline double C2F (double C) inline double C2F (double C)

{ return C*9.0/5.0 + 32.0; }{ return C*9.0/5.0 + 32.0; }

Page 30: Chap 6   函數

3030/46/46

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

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

Page 31: Chap 6   函數

3131/46/46

inline inline 函數的使用時機函數的使用時機

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

使用使用

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

Page 32: Chap 6   函數

3232/46/46

局部變數局部變數 (local variables)(local variables)

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

己獨立的記憶體空間,函數內變數的工己獨立的記憶體空間,函數內變數的工

作空間不會與其他函數的工作空間重疊,作空間不會與其他函數的工作空間重疊,

這些變數稱為這些變數稱為局部變數局部變數

Page 33: Chap 6   函數

3333/46/46

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

autoauto 是所有函數內變數的預設儲存方式,只在是所有函數內變數的預設儲存方式,只在

函數被呼叫時才存在,該函數結束後就消失函數被呼叫時才存在,該函數結束後就消失 staticstatic局部變數並不隨函數呼叫結束而消失,局部變數並不隨函數呼叫結束而消失, ss

tatictatic 變數的值保留上一次呼叫結束時的值變數的值保留上一次呼叫結束時的值 registerregister 變數可以留在變數可以留在 CPUCPU 內,提昇函數的執內,提昇函數的執

行速度行速度

Page 34: Chap 6   函數

3434/46/46

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

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

Page 35: Chap 6   函數

3535/46/46

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

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

Page 36: Chap 6   函數

3636/46/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: Chap 6   函數

3737/46/46

全域變數全域變數

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

則這些變數值變數稱為則這些變數值變數稱為全域變數全域變數 (globa(globa

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

Page 38: Chap 6   函數

3838/46/46

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

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

Page 39: Chap 6   函數

3939/46/46

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

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

Page 40: Chap 6   函數

4040/46/46

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

Page 41: Chap 6   函數

4141/46/46

extern extern 和 和 static static 兩種全域變兩種全域變數 數 externextern 全域變數:宣告這個變數已經在全域變數:宣告這個變數已經在

其他檔案內定義過了其他檔案內定義過了

staticstatic 全域變數:宣告這個全域變數只全域變數:宣告這個全域變數只

能在自己的檔案內才適用能在自己的檔案內才適用

Page 42: Chap 6   函數

4242/46/46

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

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

Page 43: Chap 6   函數

4343/46/46

範例程式 範例程式 ExtrenA.cpp : ExtrenA.cpp : 探討各種全域變數儲存種類的特性探討各種全域變數儲存種類的特性 (2/(2/3)3)// ------ // ------ 主程式主程式 ------------------------------------------------int main () int main () {{ cout << "cout << " 執行過執行過 Func1 () \n";Func1 () \n"; Func1 () ;Func1 () ; cout << "Am cout << "Am 的值是:的值是: " << " << AmAm << endl; << endl; cout << "An cout << "An 的值是:的值是: " << " << AnAn << endl; << endl; cout << endl; cout << endl; cout << "cout << " 執行過 執行過 Func2 () \n";Func2 () \n"; Func2 () ;Func2 () ; cout << "Am cout << "Am 的值是:的值是: " << " << AmAm << endl; << endl; cout << "An cout << "An 的值是:的值是: " << " << AnAn << endl; << endl; cout << "cout << " 執行過 執行過 Func3 () \n";Func3 () \n"; Func3 () ;Func3 () ; return 0;return 0;}}

Page 44: Chap 6   函數

4444/46/46

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

extern int Bp;extern int Bp; // extern // extern 變數 變數   //----- //----- 函數 函數 Fnc3 () Fnc3 () 的定義 的定義 --------------------------------void Func3 () void Func3 () {{ cout << "Bp cout << "Bp 的值是:的值是: " << " << BpBp << endl; << endl; cout << endl;cout << endl;}}

Page 45: Chap 6   函數

4545/46/46

範例程式 範例程式 檔案檔案 ExternB.cppExternB.cpp

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

Page 46: Chap 6   函數

4646/46/46

操作結果 操作結果

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