Download presentation
Presentation is loading. Please wait.
1
Chapter 6 函數
2
簡介 函數功能 參數的傳遞 函數原型 變數存活周期 自動變數、靜態變數、全域變數
3
C的函數 敘述句的集合 定義在文件範圍 擁有獨一無二的名子 使用大括號包括起來 進行某一明確定義的操作 或許有輸入參數 或許會回傳值
4
Example #include <stdio.h> #include <stdlib.h>
float avg(int n, int m) { return (n + m) / 2.0; } int main(int argc, char *argv[]) { int n1, n2; printf("Enter the 1st number:"); scanf("%d", &n1); printf("Enter the 2nd number:"); scanf("%d", &n2); printf("The average is %.2f\n", avg(n1, n2)); system("pause"); return 0;
5
參數的傳遞 參數僅傳值不傳址 函數將接收到每個參數的複本 原始參數將不受影響 結果的傳遞也是傳值 a = b + avg(c,d);
6
void 關鍵字 使用在函數不需要回傳值 作法 void f( int x, float y) {…} 使用在不需參數的函數 void f2(void){ printf( "Welcome to ..."); } … f2 ();
7
Example #include <stdio.h> #include <stdlib.h>
void print_ints(int num[], int n) { int i; if (n <= 0) return; for (i = 0; i < n; ++i) { if (i > 0) printf(","); printf("%d", num[i]); } int main(int argc, char *argv[]) { int a[] = {1, 2, 3, 4, 5}; print_ints(a, 5); system("pause"); return 0;
8
使用函數 傳入的參數型別需要先定義且不得違反 編譯器可以抓出型態不符合的錯誤 使用函數必須事先定義 但是必須提供相關資訊
C++ 和 Java 也相同
9
函數原型 函數具有幾個要點 署名(名字+ 參數型別) 回傳型態 定義明確的使用方法 為函式庫的基礎要素
10
Example #include <stdio.h> #include <stdlib.h>
float avg(int, int); /* 函式原型*/ int main(int argc, char *argv[]) { int n1, n2; printf("Enter the first number:"); scanf("%d", &n1); printf("Enter the second number:"); scanf("%d", &n2); printf("The average is %.2f\n", avg(n1, n2)); system("pause"); return 0; } float avg(int n, int m) { return (n + m) / 2.0;
11
Example /* file myfun.h */ float avg(int, int); … /* file myfun.c */
float avg(int n, mt m) { return (n + m) / 2.0; } /* file mymain.c */ #include <stdio.h> #include "myfun.h" int main(int argc, char *argv[]) { avg(x, y) return 0;
12
變數存活周期 那裡可看見這個變數 三種狀況: 區域有效 或 區塊有效 檔案有效 全域有效
13
區域有效 區塊內有效 (一對大括號) 函數內 迴圈和判斷 該變數直到區塊結束才失效
14
檔案有效 宣告在任何函數之外 在同一個檔案的任何地方都看見
15
Example #include <stdio.h> #include <stdlib.h>
int i = 3; /* 檔案有效*/ int main(int argc, char *argv[]) { int j; printf(“%d\t”, i); // ←i 檔案有效 for (j = 0; j < i; ++j) { int i = 99; // ←i 區域有效 printf("%d\t", i); { int i = j; // ←i 區域有效 } system("pause"); return 0; //
16
自動變數(auto) 存放在程式的堆疊中 存在任何在區塊內變數 每次進入區塊內會重新分配位址跟初始值
17
Example #include <stdio.h> #include <stdlib.h>
int count() { auto int n = 0; return ++n; } int main(int argc, char *argv[]) { int i; for (i = 0; i < 5; ++i) printf("%d ", count()); system("pause"); return 0; }//
18
靜態變數(static) 居住在一個特別資料區 必須定義在區塊外面 僅一次初始化 (Static) data segment 如 檔案變數
就在程式剛啟動
19
Example #include <stdio.h> #include <stdlib.h>
int count() { static int n = 0; return ++n; } int main(int argc, char *argv[]) { int i; for (i = 0; i < 5; ++i) printf("%d ", count()); system("pause"); return 0; }//
20
全域變數(extern ) 又叫程式變數 可以在不同程式原始檔之間存取 定義一個檔案變數 定義全域變數需要使用 extern 關鍵字
不需要 static 關鍵字 定義全域變數需要使用 extern 關鍵字 static + file scope = private to the file
21
Example /* file1.c */ int i = 10; /* global */
static int j = 20; /* private */ int get_j(void) { return j; } /* file2.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { extern int i; /* extern optional for funtions: */ int get_j(void); printf("i == %d\n", ++i); //i=11 printf("j == %d\n", get_j()); //j=20 system("pause"); return 0;
22
總結 函數 函數是有名字的敘述句集合 C 參數採傳值呼叫 變數存活週期區域 隱藏資訊的好幫手 statics 或許需要參數 或許有回傳值
區域, 檔案, 程式 隱藏資訊的好幫手 statics
Similar presentations