如何正确初始化 "min" 变量?

how to initialize the "min" variable properly?

我的代码在从一系列数字中找出最小值时遇到了一个小问题。当我初始化min = 0时,最小值为0。但是当我不初始化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);

您必须使用较大的数字初始化 min,否则 0 可能 仍然是最小的数字。

您可以将min初始化为

int min = INT_MAX;

INT_MAXint 可以容纳的最大值(必须为 INT_MAX 添加 <limits.h>)。

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

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

你应该做的是将它初始化为 large 值,就像你将 max 初始化为 small 值一样.使用 <limits.h> 头文件中的 INT_MAX


此外,如果您的变量不能为负数,您可能应该使用 unsigned int,并将 min 初始化为 UINT_MAX

When I initialize min = 0, the minimum value turns out as 0.

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

But when I don't initialize min, the answer is correct!

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

解决方法: 用头文件中存在的最大可能值 INT_MAX 初始化 min

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

在数组中查找最小值的常用技术是将 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] 不存在。