如何使用 stdard.h 库解决与 C 中的变量参数相关的问题?
How to solve this related to variable arguments in C using stdard.h library?
考虑以下代码:
#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 个自然数的和。 a sum 的第一个参数,它指定用户给出 10 个自然数,其总和是必需的,但我想要一些方法,以便我们可以在不给出我要添加的数字的计数的情况下找到总和。
我是说
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
将计算前10个自然数之和为55。
请想办法告诉我
您的示例不适合使用可变参数。您以类型安全为代价购买了对任意数量的值求和的灵活性。您的代码还必须依赖于指定参数的数量或提供标记值。 (在静态分析中有检查这些东西的方法,但它们依赖于编译器。)
但是什么时候需要在 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
,但它无法强制执行。
考虑以下代码:
#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 个自然数的和。 a sum 的第一个参数,它指定用户给出 10 个自然数,其总和是必需的,但我想要一些方法,以便我们可以在不给出我要添加的数字的计数的情况下找到总和。 我是说
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
将计算前10个自然数之和为55。 请想办法告诉我
您的示例不适合使用可变参数。您以类型安全为代价购买了对任意数量的值求和的灵活性。您的代码还必须依赖于指定参数的数量或提供标记值。 (在静态分析中有检查这些东西的方法,但它们依赖于编译器。)
但是什么时候需要在 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
,但它无法强制执行。