具有可变数量参数的功能

use*_*108 3 c

考虑这个功能

double avg(double v1,double v2,...)
{
    double sum=v1+v2;
    int counter=2;
    double temp;
    va_list pargs;
    va_start(pargs,v2);
    while((temp=va_arg(pargs,double))!=0.0)
    {
        sum+=temp;
        counter++;
    }
    va_end(pargs);
    return sum/counter;
}
Run Code Online (Sandbox Code Playgroud)

此调用printf("%lf\n",avg(3.0,4.5,4.5,3.0,0.0))返回正确的结果,但如果我删除0.0它打印的最后一个参数-321738127312000000000.0000000,但sum和counter具有正确的值.我有点不明白为什么我要检查!=0.0并拥有最后一个参数0.0

Ada*_*eld 6

因为没有任何其他外部信息,函数不知道传递了多少个参数.有几种策略可以解决这个问题:包括一个显式参数,即额外参数的数量,使用格式字符串来定义参数(例如作为与printf和scanf家族的功能),或者使用一个标记值如0申报的参数的结尾.

在你的情况下,如果你省略了哨兵,那么这个函数就会一直向下走,直到它达到零值,并且根据堆栈中的数据,你可能得到截然不同的结果,都是不正确的.