问题引入:为什么要使用可变参数编程
问题探究:
1.假设要求一个两位数的平均数,仅使用函数实现,两个形参分别传入两个数字,可以很快得出该函数计算两个数字的平均值问题
int Avg(int a,int b)
{
return (a+b)/2;
}
2.假设要求一个三位数的平均数,仅使用函数实现,三个形参分别传入三个数字,可以很快得出该函数计算三个数字的平均值问题
int Avg(int a,int b,int c)
{
return (a+b+c)/3;
}
3.假设要求一个1~5位数的平均数,仅使用函数实现,内部使用if…else实现,可以很快得出该函数平均值问题
int Avg1(int n,int a,int b,int c,int d,int e)
{
assert(n > 0);//需要引入<assert.h>头文件
int sum = 0;
if(n == 1)
{
sum = a;
}
else if(n == 2)
{
sum = a + b;
}
else if(n == 3)
{
sum = a + b+c;
}
else if(n == 4)
{
sum = a + b+ c + d;
}
else
{
sum = a+b+c+d+e;
}
return sum/n;
}
问题解决:为了解决大量同类型问题,不必每一次都要写一个函数,引入可变参数方程,不必每次把所有形参都写出来,可以高效率解决同类型问题
我们知道C支持可变参数的函数,这里的意思是C支持函数带有可变数量的参数,最常见的例子就是我们十分熟悉的printf()系列函数。
函数调用时参数是自右向左压栈的,举个例子:
该程序会输出什么呢?
因为函数调用时候是自右向左压栈的,所以arr[++i]即为arr[2]为3,arr[i]亦为3
所以在可变参数函数的一般形式中,左边是已经确定的参数,右边省略号代表未知参数部分
n的作用:1.定位到…开头;2.记录…中数据的个数
//n的作用:1.定位到...开头;2.记录...中数据的个数
int Avg(int n,...)
{
int sum = 0;
va_list list;//游标指针.char *list;
va_start(list,n);//将list定位到...开头
for(int i=0;i<n;i++)
{
sum += va_arg(list,int);//从list中取数据
}
va_end(list);//关闭list.list = NULL;
return sum/n;
}
测试用例: