C语言变长参数实现最简例程(printf函数实现原理解释)

C语言变长参数实现最简例程(printf函数实现原理解释)

首先看代码,代码可直接运行

#include<stdio.h>
#include<stdarg.h> /* 必须要包含的头文件 */

#define END (-1) /* 用于定义参数结尾 */

/**
 * 对n个int型正整数做累加
 */
long dtxk_add(int start, ...)
{
    long sum = 0;
    int tmp = 0;
    va_list ap;
    sum += start;
    va_start(ap, start); /* 使指针ap指向第一个参数 */
    while((tmp = va_arg(ap, int)) != END) /* 获取参数并判断是否到达结尾 */
    {
        sum += tmp;
    }
    va_end(ap);
    return sum;
}

/**
 * 主程序
 */
int main(int argc, char *argv[])
{
    printf("sum = %ld\n", dtxk_add(1, 2, 3, 4, END)); /* 输出结果10 */
    printf("sum = %ld\n", dtxk_add(5, 6, END)); /* 输出结果11 */
    return 0;
}

代码解释

关键函数:
va_start
va_arg
va_end
关键变量:
va_list ap;
va_list 类型用于声明一个变量,该变量将依次引用各参数。
注意,此处默认了全部参数均为int类型。

printf函数实现原理解释

示例代码:printf(“a=%d,b=%f”, 10, 0.2);
在这里,字符串**“a=%d,b=%f”**为第一个参数,实现步骤:

  1. 使用一个char *指针p指向字符串 "a=%d,b=%f"
  2. 输出指针p指向的字符,直到遇到符号 %
  3. 判断符号%后面的字母,如果为字母d,则调用函数va_arg(ap, int),如果为字母f,则调用函数va_arg(ap, double) 以此类推
  4. 直到*p的值为’\0’, 结束,执行函数va_end(ap)

注意:这里通过%d等占位符即指明了参数的数量,又指明了参数的类型,所有不需要前面代码里的END作为结尾标志。

其他注意点:省略号…只能出现在参数的尾部!

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值