【问题标题】:Passing arguments to a variadic function in C [duplicate]将参数传递给C中的可变参数函数[重复]
【发布时间】:2021-02-03 10:42:49
【问题描述】:

我用 C 写了这个简单的可变参数函数:

double averageVar(int cnt, ...)
{
    va_list args;
    va_start(args, cnt);

    int i;
    double res = 0;
    for (i = 0; i < cnt; i++)
    {
        res += va_arg(args, double);
    }
    res /= cnt;
    va_end(args);

    return res;
}

当我这样使用它时:

averageVar(2, 4.0, 7.88);

它工作正常,但以这种方式调用它:

averageVar(2, 4, 7.88);

会产生一些乱码,即:-0.000000。似乎我必须传递整数值,后跟 .0。这是为什么呢?

【问题讨论】:

  • 什么是4?可以使用va_arg(args, double) 处理该类型吗?
  • 您实际上是在问为什么printf("%lf", 4) 不起作用。
  • 您的函数需要double 参数。在通用类型提升后,您必须提供与该类型匹配的参数。提供一个整数就是在欺骗你自己的函数。
  • averageVar(2, 4.0, 7.88);averageVar(2, (double)4, 7.88); 有效

标签: c


【解决方案1】:

averageVar(2, 4, 7.88); 第二个参数是int 而不是double。您需要传递正确的类型参数或强制转换

double averageVar(int cnt, ...)
{
    va_list args;
    va_start(args, cnt);

    int i;
    double res = 0;
    for (i = 0; i < cnt; i++)
    {
        res += va_arg(args, double);
    }
    res /= cnt;
    va_end(args);

    return res;
}

int main(void)
{
    printf("%f\n", averageVar(2, 4.0, 7.88));
    printf("%f\n", averageVar(2, (double)4, 7.88));

    printf("%f\n", averageVar(2, 4, 7.88)); //wrong parameter type
}

通常是常数值:

4 - 整数类型

4.0f - 浮点型

4.0 - 双精度型

【讨论】:

  • 4.0f 将被提升为 double 由于默认参数提升
  • @M.M 确实 - 只是想显示数字常量格式
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 2017-07-05
  • 2015-09-23
  • 2011-03-16
  • 2014-10-20
  • 2023-01-24
  • 2014-02-27
  • 2022-01-26
相关资源
最近更新 更多