关于c的可变参数

假入我们有这么一个需求,需要通过一个参数去计算一系列商品价格的总和

 

 

1、有时候,我们可以使用数组去计算,比如:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdarg.h"
 
 
#define TEST_GOOD_FIRST_PRICE	1.1
#define TEST_GOOD_SECOND_PRICE	1.2
#define TEST_GOOD_THIRD_PRICE	1.3
#define TEST_GOOD_FOURTH_PRICE	1.4
 
 
double total(double *test_goods_first, int goods_count)
{
	double total_prices = 0;
	int index;
 
	for (index = 0; index < goods_count; index++)
	{
		total_prices += test_goods_first[index];
	}
 
	return total_prices;
}
 
int main()
{
	double test_goods_first[3]  = {TEST_GOOD_FIRST_PRICE, TEST_GOOD_SECOND_PRICE, TEST_GOOD_THIRD_PRICE};
	double test_goods_second[4] = {TEST_GOOD_FIRST_PRICE, TEST_GOOD_SECOND_PRICE, TEST_GOOD_THIRD_PRICE, TEST_GOOD_FOURTH_PRICE};
	
 
	printf("goods total pices : %.2f\n", total(test_goods_first, 3));
	printf("goods total pices : %.2f\n", total(test_goods_second, 4));
 
 
	return 0;
}


2、不过,有的时候,用可变参数,可以让我们少写很多代码!比如,可以将上边的代码修改成如下的:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdarg.h"
 
 
#define TEST_GOOD_FIRST_PRICE	1.1
#define TEST_GOOD_SECOND_PRICE	1.2
#define TEST_GOOD_THIRD_PRICE	1.3
#define TEST_GOOD_FOURTH_PRICE	1.4
 
 
double total(int args, ...)
{
	int index;
	double total_price;
	va_list ap;
	va_start(ap, args);
 
	total_price = 0;
	for (index = 0; index < args; index++)
	{
		total_price += va_arg(ap, double);
	}
 
	va_end(ap);
 
	return total_price;
}
 
 
int main()
{
	printf("goods total pices : %.2f\n", total(3, TEST_GOOD_FIRST_PRICE, TEST_GOOD_SECOND_PRICE, TEST_GOOD_THIRD_PRICE));
	printf("goods total pices : %.2f\n", total(4, TEST_GOOD_FIRST_PRICE, TEST_GOOD_SECOND_PRICE, TEST_GOOD_THIRD_PRICE, TEST_GOOD_FOURTH_PRICE));
 
	return 0;
}

省去了大量的代码!连数组都不用声明了!



3、总结:适当的时候,使用可变参数,能让我们写出更少的代码,更少的代码有时候更容易维护,更容易扩展!当然你得保证,在代码可读性还在可接受的范围内进行修改。不过有时,确实也需要写出像第一段一样的代码。只能说,两者在需要的时候进行使用,没有谁更优。



4、来看看是怎样使用可变参数的

a、需要包含头文件stdarg.h

b、将可变参数保存在va_list中

c、va_start开始读取参数,其需要接收当前函数参数表中的最后一个参数名

d、va_arg用于取出参数,比如va_arg(ap, int),就是从参数表ap中取出int偏移的每一个参数

e、va_end销毁va_list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值