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

C語言可變參數實作任意個數平均值:va_list 核心機制詳解

     編輯:關於C

stdarg.h 四巨集速查

巨集用途
`va_list ap`宣告參數列表遍歷器
`va_start(ap, last_fixed)`初始化指向第一個可變參數
`va_arg(ap, type)`取得目前參數並推進
`va_end(ap)`結束遍歷

平均值函式實作

#include 

int average(int count, ...) {
    va_list ap;
    va_start(ap, count);
    int sum = 0;
    for (int i = 0; i < count; i++)
        sum += va_arg(ap, int);
    va_end(ap);
    return sum / count; // 整數除法,若需精確請回傳 double
}

// 使用範例
int main() {
    printf("Avg of 1,2,3,4,5 = %d\n", average(5, 1,2,3,4,5)); // 3
    printf("Avg of 10,20,30 = %d\n", average(3, 10,20,30));   // 20
    return 0;
}

關鍵細節:預設參數提升

  • `float` → `double`
  • `char`/`short` → `int`
  • 因此 `va_arg(ap, float)` **錯誤**,必須用 `va_arg(ap, double)`。
  • 對於 `average`,若參數為 `double`,第一個固定參數建議改為 `int count`,可變參數用 `va_arg(ap, double)`。

進階版:支援 double 的平均值

double average_d(int count, ...) {
    va_list ap;
    va_start(ap, count);
    double sum = 0;
    for (int i = 0; i < count; i++)
        sum += va_arg(ap, double); // 注意:double
    va_end(ap);
    return sum / count;
}

變參函式設計最佳實踐

  1. 至少一個固定參數:C 標準要求,用於 `va_start` 定位。
  2. 傳遞參數個數或哨兵值:如 `printf` 透過格式字串推斷個數,`execl` 以 `NULL` 結尾。
  3. 型別安全:編譯器**無法**檢查可變參數型別,錯誤導致未定義行為。
  4. 文件化協定:清楚說明參數順序、型別、個數約定。

總結

可變參數是 C 語言實現 `printf`、`scanf`、`execl` 等函式的基石。掌握 `va_list` 四巨集操作、預設參數提升規則、參數個數傳遞協定,即可撰寫靈活的工具函式。本文以平均值為例,展示最核心的用法模式。

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