【发布时间】:2014-01-28 23:06:09
【问题描述】:
def func():
print 'no early termination'
return 0
if __name__ == "__main__":
if 1 or func():
print 'finished'
输出:
finished
因为 "1 or func()" 提前终止而不调用 func() 因为 "1 or something" 总是为真。 但是,当切换到按位运算符时:
def func():
print 'no early termination'
return 0
if __name__ == "__main__":
if 1 | func():
print 'finished'
我得到了输出:
no early termination
finished
这是为什么呢?这似乎不是很有效
【问题讨论】:
-
因为一般来说,没有有意义的方法来短路按位运算符。因此,这就是语言行为的定义方式。
-
“位或”和“逻辑或”听起来很相似,并且具有相似的运算符(在某些语言中),但它们是非常不同的运算。
-
按位运算的结果是算术的,不是布尔的。
-
短路并不总是更有效,因为它相当于条件跳转。跳转可能会导致管道被刷新,代价相当高。