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

C 語言可變參數應用:實現動態參數累加求和函數

     編輯:關於C語言

場景

函數參數個數不固定,需將所有整數參數累加返回。首參 count 指定后續參數個數。

代碼實現

#include <stdio.h>
#include <stdarg.h>

int add(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;
}

int main() {
    printf("%d\n", add(3, 5, 5, 6));           // 16
    printf("%d\n", add(10, 1,2,3,4,5,6,7,8,9,10)); // 55
    return 0;
}

關鍵步驟

  1. va_list ap; 定義參數列表游標。
  2. va_start(ap, last_fixed_arg); 初始化,last_fixed_arg 是最后一個固定參數(此處為 count)。
  3. va_arg(ap, type) 依次取出參數,**調用者必須保證類型匹配**,否則未定義行為。
  4. va_end(ap); 清理(某些架構需棧指針恢復)。

注意事項

  • 無類型安全:傳入 double 但用 va_arg(ap, int) 取值會導致棧錯位、結果錯誤。
  • 無參數個數自檢:若實際參數少于 count,讀取越界;多于則忽略多餘。
  • C++ 推薦使用可變參數模板(template<typename... Args> auto add(Args... args))實現編譯期類型安全。

擴展:無 count 參數的哨兵模式

int add_sentinel(int first, ...) { // 以 -1 結束
    va_list ap; va_start(ap, first);
    int sum = first;
    while (1) {
        int v = va_arg(ap, int);
        if (v == -1) break;
        sum += v;
    }
    va_end(ap); return sum;
}
// 用法:add_sentinel(1,2,3,4,5,-1);

總結

stdarg.h 機制讓 C 支持可變參數函數,核心是調用者知曉參數個數與類型、被調用者按約定順序取參。動態累加是最典型的教學示例,實際項目中常用於日志格式化(log(fmt, ...))、字符串拼接、消息構造等場景。

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