条件在for循环不工作在C如果它是在一定的顺序,交换任务使它工作

0sgqnhkj  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(77)

这发生在我的一个C项目中。

#define total 400

unsigned long values[total];

字符串
最初,整个值数组被初始化为0xffffffff,然后填充一些有效值。有一种使用情况是整个数组都填充了有效的条目。在这种情况下,我看到一个崩溃,当我尝试打印i值时,它超过了total(400)。

//Crashing, i value goes beyond 400
for (i = 0; ((values[i] != 0xffffffff) && (i < total)); i++)
{
   // some processing code
}


但如果我只是交换条件,它工作正常,它不会超过总。

//Working fine

for (i = 0; ((i < total) && (values[i] != 0xffffffff)); i++)
{
   // some processing code
}


任何人都见过这种行为。如果你曾经面对过这个问题,请给我一些启示

lrpiutwd

lrpiutwd1#

这是短路。它旨在提高代码的效率。
在你的第一个例子中

((values[i] != 0xffffffff) && (i < total))

字符串
代码将尝试计算第一个表达式,并且它是true,计算第二个表达式。如果第一个表达式为false,则整个条件的值将为false,因此不需要计算第二个表达式。
由于您正在评估values[i],因此在检查边界之前,它将失败越界。
反转条件,就像你的第二个例子一样

((i < total) && (values[i] != 0xffffffff))


现在,首先检查边界,因此不计算数组元素,并且没有失败。

相关问题