现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

关于c的可变参数

2014-09-19 04:55 工业·编程 ⁄ 共 1995字 ⁄ 字号 暂无评论

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

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

给我留言

留言无头像?