zoukankan      html  css  js  c++  java
  • 可变参数列表源码的剖析。

      我们先来看一段代码。利用可变参数来求一段数据的最大值。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<windows.h>
    #include<string.h>
    #include<assert.h>
    int maximum(int num, ...)
    {
        va_list max1;
        int i = 0;
        int Max = 0;
        va_start(max1, num);
        for (i = 0; i < num; i++)
        {
            int M = va_arg(max1, int);//取所在的值的下一个值,即第一个值和第二个值(num=2时候)
            Max = Max>M ? Max : M;//利用?操作符比较。
        }
        return Max;
        va_end(max1);
    }
    int main()
    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        printf("请输入a,b,c,d的值:>");
        scanf("%d %d %d %d", &a, &b, &c, &d);
        printf("
    ");
        int max1 = maximum(2, a, b);
        int max2 = maximum(3, a, b, c);
        int max3 = maximum(4, a, b, c, d);
        printf("两个数,三个数,四个数最大值分别为:>%d,%d,%d
    ", max1, max2, max3);
        return 0;
    }

      可以很清楚的看到,我们在定义maximum函数的时候,用到了可变参数“...”,这里就需要提及四个用到的宏——

      va_list:用于定义变量,用于访问参数列表未确定的部分(即“...”的内容)

      va_start:用于初始化变量,其第一个参数是va_list定义的变量,第二个参数是省略号前最后一个有名字的参数。上面代码初始化过程是把arg变量设置为指向可变参数部分的第一个参数(例如"int max1 = maximum(2, a, b);"中的‘a’)。

      va_arg:用于取arg后一个参数的地址,它有两个参数,一个是va_list定义的变量,还有一个是下一个参数的类型。(这里就又提到宏和函数的区别了,因为va_arg可以把类型当做参数,可见其为宏不是函数。)

      va_end:用于结束调用,防止生成野指针。(个人理解就是释放了这个定义的变量(自己猜的))。

    感谢审阅。

  • 相关阅读:
    mina:IoBuffer 常用方法(转载)
    js:对象之间的复制
    jquery与angular的交互
    javax.crypto.BadPaddingException: Given final block not properly padded
    jstree:重新加载数据集,刷新树
    TCP 握手 -> 微服务
    eclipse 中添加source
    02 IO
    为什么常用 Map<> map = new HashMap()
    自组织 Self-Orginaztion
  • 原文地址:https://www.cnblogs.com/shy0322/p/7814506.html
Copyright © 2011-2022 走看看