當同一段邏輯需要在多處執行時,將其封裝為**函式** 是結構化程式設計的核心思想。無參函式 (不接收引數、不回傳值) 是最簡單的形式,適合「執行固定動作」的場景,如列印選單、繪製圖形、初始化硬體等。
#includeint main() { puts("The first one:"); // 印星星邏輯重複出現 for (int i = 1; i <= 4; i++) { for (int j = 1; j <= i; j++) putchar('*'); putchar('\n'); } puts("The second one:"); // 完全相同的邏輯又寫一次 ❌ for (int i = 1; i <= 4; i++) { for (int j = 1; j <= i; j++) putchar('*'); putchar('\n'); } return 0; }
#include// 函式宣告 (原型) void print_stars(void); // (void) 明確表示無參數 // 函式定義 void print_stars(void) { for (int i = 1; i <= 4; i++) { for (int j = 1; j <= i; j++) putchar('*'); putchar('\n'); } // return; // void 函式可省略 return } int main() { puts("The first one:"); print_stars(); // 呼叫 1 puts("The second one:"); print_stars(); // 呼叫 2 return 0; }
main() 開始
│
├─► puts("The first one:")
│
├─► print_stars() 呼叫
│ │
│ ├─► 進入 print_stars 堆疊框架
│ │ ├─► 迴圈印星星
│ │ └─► 結束 (隱式 return)
│ │
│ └─► 返回 main 下一行
│
├─► puts("The second one:")
│
├─► print_stars() 呼叫 (第二次)
│ └─► 同樣流程...
│
└─► return 0 → 程式結束
| 概念 | 說明 |
|---|---|
| 函式宣告 (原型) | 告知編譯器函式名稱、回傳型別、參數列表。放在 main 前或 .h 檔。 |
| 函式定義 | 實際的程式碼本體。 |
| 呼叫 | print_stars(); — 控制權轉移至函式,執行完畢返回緊下一行。 |
| 無參數 | void print_stars(void) — C 標準寫法;void print_stars() 在 C89 為「未指定參數」,C99+ 等同 (void)。 |
| 無回傳值 | void 回傳型別 — 不能用 return 值;,只能 return; 或落底返回。 |
void hardware_init(void) { /* 設定 GPIO、UART、SPI... */ }
void system_cleanup(void) { /* 關檔、釋放記憶體、關電源... */ }
void show_menu(void) {
puts("=== 學生管理系統 ===");
puts("1. 新增");
puts("2. 查詢");
puts("3. 刪除");
puts("0. 離開");
}
void delay_ms(unsigned int ms) {
volatile unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1200; j++); // 視時鐘調整
}
typedef enum { IDLE, RUN, STOP } State;
State current = IDLE;
void state_machine_step(void) {
switch (current) {
case IDLE: if (start_btn) current = RUN; break;
case RUN: if (stop_btn) current = STOP; break;
case STOP: if (reset_btn) current = IDLE; break;
}
}
print_, init_, show_)。static void func(void),避免符號衝突。無參函式是「將重複動作封裝、命名、複用」的最小單位。掌握 宣告 → 定義 → 呼叫 → 返回 的控制流,並養成**單一職責、低耦合**的設計習慣,是從「寫能跑的碼」進化為「寫好維護的碼」的關鍵一步。