代码:#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:用于结束调用,防止生成野指针。
转载于:https://www.cnblogs.com/lsiyu/p/9094513.html