需要解释一下AND boolean工作的混乱方式

时间:2013-04-11 20:22:35

标签: boolean

我正在辅导基本的搜索和排序。在插入排序中,当我的数值大于它之前的值时,我会负向迭代。当然,这种方法可能会导致问题,因为有一个检查调用不存在的数组[-1]。

如下面粗体下划线所示,添加&x> 0布尔值可防止索引问题。

我的问题是这是怎么回事?不会调用数组[-1]来确保两个布尔值的有效性吗?

the_list = [10,2,4,3,5,7,8,9,6]

for x in range(1,len(the_list)):
    value = the_list[x]


    while value < the_list[x-1] **and x > 0**:

        the_list[x] = the_list[x-1]

        x=x-1

    the_list[x] = value

print the_list

2 个答案:

答案 0 :(得分:0)

我不确定我完全理解这个问题,我不知道这是什么编程语言,但大多数现代编程语言默认使用所谓的短路布尔评估,所以一旦知道结果,就不会进一步评估逻辑表达式。

您可以使用它来防范范围溢出,如下所示:

while x > 0 and value < the_list[x-1]

但是这里检查x的范围必须在使用之前

答案 1 :(得分:0)

当且仅当两个参数都为真时,

AND操作返回true,因此如果其中一个参数为假,则无法检查其他参数,因为此时已知最终值。至于你的例子,通常评估从左到右,但它不是一个原则,它看起来你使用的语言不遵循该规则(另外它仍然应该在阵列查找时崩溃)。但是可能是,这个特定的实现以某种方式优化了这个(恕我直言并不是一个好主意)并在查找数组之前首先评估“更简单”的东西(比如检查x > 0)。检查规范为什么这个确切的顺序适合你,就像在大多数流行语言中一样,如果在查找之前不评估测试x > 0,你仍会崩溃