变长参数入参VS数组入参

gzip写烦了,先写个小题目。

当函数的参数个数可变时,我们可以采用变长参数入参或者数组入参(重载不在此讨论之列)。通常还都会有一个参数来标明实际的参数个数:

Func_va(int num, ...)

Func_array(int num, type array[])

那么这两者有什么区别呢?

区别一:类型检查

可变参数:不需要定义类型,编译器也不会做检查。甚至可变参数之间忘加逗号,编译时竟然也不会报错;好处是比较灵活。

数组参数:是有类型的,做参数检查的。

区别二:num参数

可变参数:num参数值必须与后面实际跟的参数个数相匹配。尼玛,多少次了,我只是改了后面的变参,忘了改num了。

数组参数:难道可以随便写!?当然不是,但是在某些情况下,可以用sizeof(array)/sizeof(array[0])来表示,这样以后就不用操心这个参数了,也算是一点小小的好处吧。

区别三:使用的场景

可变参数:因为调用变参函数时,要把变参一一列出,所以很适合跟语义密切相关的场景。举个例子吧,现在有个叫split的函数,它能把输入的字符串以空格为分隔符,打断成一个个单词,并赋值给传入的变参。现在要输入一个表示日期的字符串,但格式有3种:”yyyy mm dd”、”dd mm yyyy”、”mm dd yyyy”,具体什么格式由变量format_type说明。用变参数函数就可以写成这样:

if (format_type == 1)
    split(date_string, 3, &year, &month, &day);
else if (format_type == 2)
    split(date_string, 3, &day, &month, &year);
else if (format_type == 3)
    split(date_string, 3, &month, &day, &year);

而用数组参数呢,就会这样:

split(date_string, 3, date_element_array);
//然后根据format_type把date_element_array中的元素赋值给相应变量,或者在数组内部捣腾成按年月日的顺序

用数组参数就会给人很罗嗦的感觉,一个工作分成了两步走;而用变参参数,字符串是什么格式,依次赋给哪些变量,都一目了然,不容易出错,或者说容易检查。

但变参数函数的一个硬伤是,参数需要一一列出,因此不易封装。我们很少见到把一个可变参数再封装起来的情况。变参函数往往是直接供比较高层的业务代码调用的,在实现那些“召之即来挥之即去”的工具函数(utility)时很有用武之地。

数组参数:多用在各变参没有分别、可以统一处理的情况下。所以适合用在较低层的函数上,也容易被封装起来。


以上就是我的一点总结。不过,“运用之妙存乎一心”,在实践中,我们还是应该具体问题具体分析的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值