2017-04-24 227 views
0

我有一个函数来计算数组中偶数的算术平均值。函数返回不是预期的值

int func(int *x, int length) 
{ 
    float even_sum = 0; 
    int even_num; 
    int i; 
    float result; 
    for (i = 0; i<length; i++) 
{ 
    if (x[i] % 2 == 0) 
    { 
     even_sum = even_sum + x[i]; 
     even_num++; 
    } 
} 
result = even_sum/even_num; 
return result; 

}

给人一种阵列1 2 2 1我希望收到2为平均,但我不断收到0的结果。我的代码中的错误在哪里?

+3

你用什么编译器没有提醒你使用未初始化的变量?或者,你为什么忽略编译器提供的宝贵警告?如果人们只是注意编译器警告,那么堆栈溢出的所有C语言问题中的很大一部分可以被消除。 –

+0

http://ideone.com/J02bRM – BLUEPIXY

+0

该函数的行为是未定义的,因为'even_num'在检索其值之前从未初始化过。 – Peter

回答

1
int func(int *x, int length) 
{ 
    float even_sum = 0; 
    int even_num; // <-- uninitialized, could be anything! 
    int i; 
    float result; 
    for (i = 0; i<length; i++) 
{ 
    if (x[i] % 2 == 0) 
    { 
     even_sum = even_sum + x[i]; 
     even_num++; // <-- adding 1 to anything yields undefined behavior 
    } 
} 
result = even_sum/even_num; // <-- even more undefined behavior 
return result; 
} 

您初始化了一些变量,但不是全部变量。最好养成将变量设置为明智的起始值的习惯,就像你在这里使用float even_sum = 0;

1

初始化even_num=0

如果你不初始化变量,也可以有垃圾值。

在你的情况下,even_num有一个巨大的值,大于even_sum导致你的结果为0

1

@Pbd是正确的。如果您安装了最新版本的gcc,并在编译时使用命令行标志-Wall -Wextra -Wshadow,它会给您一个未初始化值的警告。

-1

我认为你的代码中唯一的问题是当你传递int数组到这个函数。除此之外,一切看起来都很好。我通过初始化'x'数组运行代码,它工作正常。