如何正确初始化 "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_MAX
是 int
可以容纳的最大值(必须为 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]
)具有有效索引 0
到 19
。 运行 从 1
到 20
的循环 - 因此访问 a[1]
到 a[20]
给出了未定义的行为,因为 a[20]
不存在。
我的代码在从一系列数字中找出最小值时遇到了一个小问题。当我初始化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_MAX
是 int
可以容纳的最大值(必须为 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 as0
.
因为在那种情况下,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]
)具有有效索引 0
到 19
。 运行 从 1
到 20
的循环 - 因此访问 a[1]
到 a[20]
给出了未定义的行为,因为 a[20]
不存在。