前言
在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变数目的参数。简单来说,就是函数的参数个数可变,参数类型不定的函数。
C/C++
变参数函数使用在其最后一个参数后加省略号声明,例如int printf(const char* format, ...);
。相关头文件定义在<stdarg.h>
库文件中,库文件中含以下重要工具:
类型 | 说明 |
---|---|
va_list args | 定义变参列表arg |
函数 | 说明 |
---|---|
va_start(args,n) | 初始化args指向n的下一个参数 |
va_arg(args,type) | 访问下当前的type类型参数,args指向下一个参数 |
va_copy(args1,args) | 获取args参数副本赋给args1 |
va_end(args) | 释放args |
说明:
- 变参是通过三个点号(…)来表示。
- 变参不能是函数第一个参数,否则编译器会报错
- 变参必须是函数的最后一个参数
- va_start的第二个参数要求是最后一个命名参数
求和函数示例:
int sum(int n,...)
{
int sum=0;
va_list args;
va_start(args,n);
while(n>0)
{
sum+=va_arg(args,int);
n--;
}
va_end(args);
return sum;
}
如sum(3,0,1,2)表示3个数求和(0,1,2)。
缺点:第一个参数不能是参变参数。
JAVA
写法与C/C++类似,不同之处在于JAVA可以只有变参参数,且JAVA必须带有参数名。
public class test{
static int sum(int... n){
int r=0;
for (int i=0;i<n.length;i++){
r+=n[i];
}
return r;
}
public static void main(String args[]){
System.out.println(sum(1,2,3));
}
}
注意:
- JAVA变参要指定参数名
- 变参可以像字符串一样访问
- 变参后不可再跟参数
- 可以只有变参
Python
用*
做变参:
传入的参数被视为元组或列表
def sum(*n):
r = 0
for i in n:
r = r+i
return r
print(sum(1,2,3))
用**
做变参:
传入的参数被视为字典
def p(**n):
print(n['a'])
p(a='A', b=3, c=3)
这里**n被视为字典,将会输出索引为a的字典值,即后面的A。