在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
答案 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,则表示您正在调用未定义的行为。