我的代码中有一个小问题,就是从一系列数字中找到最小值。当我初始化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
答案 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_MAX
是int
可以保留的最大值(必须为<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]
中)具有有效索引0
到19
。运行从1
到20
的循环 - 因此访问a[1]
到a[20]
会产生未定义的行为,因为a[20]
不存在。