变量编号参数列表从其第二个条目

时间:2016-03-04 22:57:19

标签: c++ visual-c++

在Visual Studio 2012中,当我运行以下代码(仅计算数字的平均值)时,会给出错误的答案。 for循环 - 由于某种原因 - 从Number = 1开始,超过Number = 9一个条目。

#include <stdio.h>
#include <stdarg.h>

float avg(int Count, ...)
{
    va_list Numbers;
    va_start(Numbers, Count);
    int Sum = 0;
    for(int i = 0; i < Count;  ++i)
    {
        int entry = va_arg(Numbers, int);
        printf("%d   %d\n", i, entry);
        Sum += entry;   
    }
    va_end(Numbers);

    float av = Sum/Count;
    return(av);
}

int main()
{
    float Average = avg(10, 1, 2, 3, 4, 5, 6, 7, 8, 9);
    printf("The average of the first 10 whole numbers: %f\n", Average);
}
我检查过,例如Passing variable number of arguments around但我无法弄清楚为什么va_arg首先从Numbers拉出第二个条目。我的机器上的代码结果是:

0   1
1   2
2   3
3   4
4   5
5   6
6   7
7   8
8   9
9   790803
The average of the first 10 whole numbers: 79084.000000

2 个答案:

答案 0 :(得分:3)

使用va_arg()时,它只处理参数列表的变量部分,而不处理具有命名参数的初始部分。因此,对va_arg的第一次调用得到entry = 1,因为这是变量部分中的第一个参数。

Number参数应该是附加参数的计数,它不应该计算在内。由于您只传递了9个变量参数,因此应将其称为

float Average = avg(9, 1, 2, 3, 4, 5, 6, 7, 8, 9);

此外,当您计算平均值时,其中一个除法操作数必须为float。否则,它将计算一个整数商,该结果对结果进行舍入,然后将该舍入结果赋值给av变量。一个简单的解决方案是将Sum声明为float而不是int

答案 1 :(得分:2)

因为您已将Count设置为10.如果您告诉avg有10个数字,但您只提供9,则表示您正在调用未定义的行为。