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

C語言可變參實戰:實現參數累加求和函數 add(count, ...)

     編輯:C 語言入門

可變參函數的經典應用場景之一是不定數量同類型參數的聚合運算。本文實現一個通用的 add(int count, ...) 函數,接收第一個參數為後續參數個數,返回所有 int 參數的累加和。代碼簡潔,完美展示 stdarg.h 標準宏的使用範式。

核心代碼

#include 
#include 

int add(int count, ...) {
    va_list ap;
    va_start(ap, count);  // 以 count 為定位參數
    
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += va_arg(ap, int);  // 依次取出 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;
}

運行結果

16
55

關鍵點解析

  1. count 參數定位:可變參函數無法自動知道參數個數,必須通過協議約定(如首參數計數、格式字符串、哨兵值)傳遞。
  2. va_start(ap, count):初始化游標指向 count 之後的第一個可變參。
  3. va_arg(ap, int):按 int 類型讀取並推進游標。注意:傳入 short/char 會提升為 int,取值仍用 int;傳入 float 提升為 double,取值需用 double。
  4. va_end(ap):某些平台需釋放臨時結構,不可省略。

擴展:支持 double 累加

double add_double(int count, ...) {
    va_list ap;
    va_start(ap, count);
    double sum = 0.0;
    for (int i = 0; i < count; i++) {
        sum += va_arg(ap, double);  // float 會提升為 double
    }
    va_end(ap);
    return sum;
}

工程應用場景

  • 日誌系統:log_printf(level, fmt, ...)
  • 數學庫:max(count, ...), min(count, ...), avg(count, ...)
  • 配置初始化:set_multiple(obj, count, field1, val1, field2, val2, ...)
  • 測試框架:assert_all(count, cond1, cond2, ...)

避坑提醒

錯誤寫法後果正確寫法
va_arg(ap, char)讀取錯誤位寬,後續參數錯位va_arg(ap, int) 後轉型
va_arg(ap, float)讀取 4 字節實為 8 字節 doubleva_arg(ap, double)
漏調 va_end部分平台棧損壞/內存洩漏必須成對調用
count 與實際參數不符越界讀取,未定義行為調用端嚴格保證一致

add(count, ...) 是可變參函數最純粹的教學示例。掌握其「計數定位 + 循環取值 + 資源清理」三步範式,即可舉一反三實現各類聚合運算函數。

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