首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言無參函式呼叫:從重複程式碼到模組化重構

     編輯:關於C

前言:為什麼需要函式?

當同一段邏輯需要在多處執行時,將其封裝為**函式** 是結構化程式設計的核心思想。無參函式 (不接收引數、不回傳值) 是最簡單的形式,適合「執行固定動作」的場景,如列印選單、繪製圖形、初始化硬體等。

案例:重複印星星圖形

重構前:程式碼重複

#include 

int 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; 或落底返回。

進階:無參函式的實用模式

1. 初始化/清理流程

void hardware_init(void) { /* 設定 GPIO、UART、SPI... */ }
void system_cleanup(void) { /* 關檔、釋放記憶體、關電源... */ }

2. 選單顯示

void show_menu(void) {
    puts("=== 學生管理系統 ===");
    puts("1. 新增");
    puts("2. 查詢");
    puts("3. 刪除");
    puts("0. 離開");
}

3. 延遲/忙碌等待 (嵌入式常見)

void delay_ms(unsigned int ms) {
    volatile unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 1200; j++);  // 視時鐘調整
}

4. 狀態機步進

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;
    }
}

良好習慣清單

  1. 單一職責:一個函式只做一件事,函式名稱動詞開頭 (print_, init_, show_)。
  2. 宣告前置:在檔案頂部或 .h 宣告,避免隱式宣告警告。
  3. 靜態區域化:僅本檔使用加 static void func(void),避免符號衝突。
  4. 避免全域變數依賴:若需資料,改用有參函式傳遞,提高可測試性與複用性。
  5. 註解說明:功能、副作用 (如修改硬體暫存器、輸出至螢幕)。

總結

無參函式是「將重複動作封裝、命名、複用」的最小單位。掌握 宣告 → 定義 → 呼叫 → 返回 的控制流,並養成**單一職責、低耦合**的設計習慣,是從「寫能跑的碼」進化為「寫好維護的碼」的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved