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

标签 c standard-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 个自然数的总和。 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/

相关文章:

java - 谁在 Java 中实现操作系统接口(interface)?

windows.Environ() 字符串 [0] 和 [1]

c++ - 在函数返回后释放动态分配的结构数组。

c - Break 语句的行为

C malloc() 数组即使在被访问后也不会占用内存

c - C 程序读取二进制文件并仅输出 float 形式的零而不是文件内容

c++ - 是否有任何 100% C++11 兼容的 std 实现?

c - C标准库中的函数在哪里定义的?

c - C 中 pthread 不退出

c++ 在遍历所有迭代器时删除 std::vector.end()