gpt4 book ai didi

c - 如何使用 stdard.h 库解决与 C 中的变量参数相关的问题?

转载 作者:行者123 更新时间:2023-11-30 15:13:43 24 4
gpt4 key购买 nike

考虑以下代码:

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com