2015-05-04 140 views
-1

我的代码中有一个小问题,用于从一系列数字中找到最小值。当我初始化min = 0时,最小值变为0.但是当我没有初始化min时,答案是正确的!如何正确初始化“min”变量?

为什么会发生这种情况? Xcode告诉我我应该初始化min变量。

int a[20] = {0}; 
int max = 0; 
int min ; 
int sum = 0; 

srand((unsigned)time(NULL)); 

for (int i = 1; i <= 20; i++) { 
    a[i] = 100 + rand()%(200 - 100 + 1); 

    if (max < a[i]) { 
     max = a[i]; 
    } 
    printf("%d,%d\n",a[i],i); 

    if (min > a[i]) { 
     min = a[i]; 
    } 

    sum += a[i]; 
} 

printf("最大值:%d\n",max); 
printf("最小值:%d\n",min); 
printf("平均值:%d\n",sum/20); 
+1

你认为'if(min> a [i])'是做什么的?只需从'limits.h'初始化'min'到'INT_MAX',一切都可以正常工作。 –

回答

0

编译器警告是因为访问未初始化变量的值会导致未定义的行为。

的常见技术可以找到在一个数组的最小值是初始化min是阵列中的第一个元素,然后遍历后续元素

min = a[0]; 
for (i = 1; i < 20; ++i)  /* assume 20 elements */ 
    if (a[i] < min) min = a[i]; 

这适用于所有的数字类型,可以是使用<运算符进行比较,而不必费力寻找超出数组中所有可能值的值。

要注意的另一件事是数组索引从零开始。因此,一个有20个元素的数组(如int a[20])的有效索引为019。运行从120的循环 - 因此访问a[1]a[20]会产生未定义的行为,因为a[20]不存在。

+0

谢谢,先生...我可以知道你的github吗? – rectinajh

+0

没有github。 – Peter

1

你必须有大量初始化min,否则0威力保持为最小数量。

可以初始化min作为

int min = INT_MAX; 

INT_MAX是可以通过int举行的最大值(必须添加<limits.h>INT_MAX)。

如果你没有用一个值初始化min,那么它将有一个不确定的值,它可以是任何东西,所以使用它们的值之前总是初始化局部变量..

2

如果不初始化一个局部变量,它的值是不确定,并使用它将导致未定义的行为

你应该做的是什么初始化为值,就像你初始化max值。使用<limits.h>头文件中的INT_MAX


另外,如果你的变量不能为负数,您应该使用unsigned int,并初始化minUINT_MAX

2

当我初始化min = 0,最小值原来作为0

因为在那种情况下,if (min > a[i])总是错误的。 Remeber,a[i]为> = 100

但是,当我不初始化min,得到的答案是正确的!

如果你没有初始化局部变量,它的值是不确定的,并且包含一些垃圾值(可能是很大的值)。所以,看似,你的逻辑工作,你是显然得到权利答案。但是,使用未初始化的局部变量的值调用undefined behaviour

解决方案: 初始化min具有最大possbile值,INT_MAX存在于头文件。