这发生在我的一个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
}
型
任何人都见过这种行为。如果你曾经面对过这个问题,请给我一些启示
1条答案
按热度按时间lrpiutwd1#
这是短路。它旨在提高代码的效率。
在你的第一个例子中
字符串
代码将尝试计算第一个表达式,并且它是
true
,计算第二个表达式。如果第一个表达式为false,则整个条件的值将为false,因此不需要计算第二个表达式。由于您正在评估
values[i]
,因此在检查边界之前,它将失败越界。反转条件,就像你的第二个例子一样
型
现在,首先检查边界,因此不计算数组元素,并且没有失败。