zoukankan      html  css  js  c++  java
  • 不定参数

    相关函数及类型

    va_list;  //类似char *argv[], 用于接收不定参数
    void va_start(va_list ap, last); //初始化, last参数是省略号前的第一个参数
    type va_arg(va_list ap, type); //取出参数, type为数据类型
    void va_end(va_list ap); //结束, 销毁ap
    

    注意:
    如果要遍历所有参数, 不能用va_arg返回值作为判断依据, 需自己显示或隐示(printf中用fmt里的%作为判断依据)传入一个表示数量的参数

    例子

    例1.求多个数的和

    //版本1: 不输出不定参数
    void sum(int num_arg,...){
        int i,sum=0;
     
        va_list va;
        va_start(va,num_arg);
     
        for(i=0;i<num_arg;++i)
            sum+=va_arg(va,int);
     
        printf("sum = %d
    ",sum);
        va_end(va);
    }
    

    例2.求未知参数的个数

    #include <stdio.h>
     
    #define COUNT_ARGS2(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_,...) _
    #define COUNT_ARGS(...) COUNT_ARGS2(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1);
     
    int main(int argc, char *argv[]){
        int num=COUNT_ARGS("what",1,2.2,"the");
        printf("%d=4
    ",num);
        return 0;
    }
    

    注:__VA_APRGS__是系统宏,作用是将前面的三个冒号的内容原封不动的复制过来
    我们自己定义的第一个宏中的类似"_+数字"只是普通的参数, 没有什么特殊作用, 包括第11个参数"_"也只是一个普通参数而已, 这个宏的作用都是将第11个参数返回
    第二宏调用第一个宏来取出第11个参数(一个数字); 后面的是数字用于标记参数的个数
    这里面的逻辑是:
    第一个宏: 定义一个算法, 专门用于计数, 数到11就停, 然后取出这个位置的参数
    第二个宏: 将所有参数排位[...[0], ...[1], ...[n], 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], 数到第11个参数取出数字, n+1为可变参数的个数
    具体算术为: 第一步算出(11-(n+1))剩多少, 然后从...[n]继续数(10+1)-(11-(n+1))个停下取出数字, 计算(10+1)-(11-(n+1))=11-(10-n)=n+1
    这里面有个隐藏条件, 那就是...中的参数个数不超过10个(小于等于10)

  • 相关阅读:
    插入排序的算法分析
    SQL的UNION操作
    二分查找的思路
    怎么看吉他简谱
    一句CSS代码杜绝网站iframe挂马
    关于NewFolder.文件夹无法删除的办法
    C#监听USB接入
    C# 系统服务添加安装
    .NET 实现ISAPI过滤器,指定类型文件防下载
    ASP 简单的异或加密方法
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5744726.html
Copyright © 2011-2022 走看看