2016-03-04 70 views
1

在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

因为你已经设置Count 10;如果你告诉avg,有10个号码,但只提供9,要调用未定义的行为。

3

当您使用va_arg()时,它仅处理参数列表的变量部分,而不处理具有命名参数的初始部分。因此,第一个拨打va_arg的电话将获得entry = 1,因为这是变量部分中的第一个参数。

Number参数应该是附加参数的计数,它不应该自行计数。既然你只有通过9个变量参数,你应该把它作为

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

此外,当你计算平均值,该师一个操作数必须是float。否则,它将计算一个整数商数,将整数结果舍入,然后将该舍入结果分配给av变量。一个简单的解决方案是宣布Sumfloat而不是int