如何正确初始化“min”变量?

时间:2015-05-04 07:41:27

标签: c gcc initialization

我的代码中有一个小问题,就是从一系列数字中找到最小值。当我初始化public IQueryable<T> Includes<T>(IQueryable<T> queryable, params Expression<Func<T, Object>>[] paths) { if (paths == null || paths.Length <= 0) return queryable; foreach (var path in paths) { queryable = queryable.Include(path); } return queryable; } 时,最小值变为0.但是当我不初始化min = 0时,答案是正确的!

为什么会这样? Xcode告诉我应该初始化min变量。

min

4 个答案:

答案 0 :(得分:2)

如果您没有初始化局部变量,则其值为 indeterminate ,并且使用该值将导致未定义的行为

您应该将其初始化为 large 值,就像将System.Threading.Tasks.Task初始化为 small 值一样。使用<limits.h>标题文件中的CancellationToken

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

答案 1 :(得分:2)

  

初始化min = 0时,最小值为0

因为在这种情况下,if (min > a[i])始终为false。记住,a[i]是&gt; = 100。

  

但是当我没有初始化min时,答案是正确的!

如果你没有初始化局部变量,那么它在不确定的值中包含一些垃圾值(可能是一个大的值)。所以,看似,你的逻辑有效,而你显然得到正确的答案。但是,使用未经初始化的局部变量的值会调用undefined behaviour

<强>解决方案: 使用头文件中存在的最大可能值min初始化INT_MAX

答案 2 :(得分:1)

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

您可以将min初始化为

int min = INT_MAX;

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

如果您没有使用值初始化min,那么它将具有不确定的值,可以是任何值,因此在使用其值之前始终初始化您的局部变量。

答案 3 :(得分:1)

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

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