考虑以下代码:
#include<stdio.h>
#include<stdarg.h>
int sum(int, ...);
int main()
{
int a;
a=sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
printf("the sum is %d", a);
return 0;
}
int sum(int a, ...)
{
int s=0, i=1;
va_list ls;
va_start(ls, a);
while(i<=a)
{
s=s+va_arg(ls, int);
i++;
}
va_end(ls);
return s;
}
上面的代码通过 sum 函数使用变量参数计算前 10 个自然数的总和。 sum 的第一个参数,指定用户给出 10 个自然数,其总和是必需的,但我想要某种方法,以便我们可以找到总和,而无需给出我要添加的数字的计数。 我的意思是
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
将计算前 10 个自然数的总和,即 55。 请找到方法并告诉我
最佳答案
您的示例不是可变参数的良好用例。您可以以牺牲类型安全为代价来获得对任意数量的值求和的灵 active 。您的代码还必须依赖于指定参数数量或提供哨兵值。 (有一些方法可以在静态分析中检查此类内容,但它们依赖于编译器。)
但是什么时候需要对 C 中的任意值列表求和呢?在 C 语言中,数据以数组的形式组织。所以做你想做的事情的 C 方法是:
int array_sum(int a[], size_t n)
{
int sum = 0;
while (n--) sum += a[n];
return sum;
}
如果需要,您可以将其转换为带有使用 C99 复合文字和 countof
的可变参数宏的可变参数函数。宏,它确定数组的大小:
#define SUM(...) array_sum((int[]){__VA_ARGS__}, \
sizeof((int[]){__VA_ARGS__}) / sizeof((int[]){__VA_ARGS__}[0]))
现在您可以使用数组和可变参数列表:
int a[] = {1, 2, 3, 4, 5, 6};
printf("%d\n", array_sum(a, 6));
printf("%d\n", SUM(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
printf("%d\n", SUM(0xff, 1ull, 0.0));
请注意在使用通常规则求和之前如何将非整数转换为有符号整数。 <stdarg.h>
在这种情况下,方法将不起作用,因为该函数依赖于 ints
的所有参数。 ,但它没有办法强制执行。
关于c - 如何使用 stdard.h 库解决与 C 中的变量参数相关的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34410673/