2016-03-04 54 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

相關問題