代码:
#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("\n"); 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\n", max1, max2, max3); return 0; }
宏:

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

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

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

  va_end:用于结束调用,防止生成野指针。

posted on 2018-05-26 22:06  lsiyu  阅读(314)  评论(0编辑  收藏  举报