首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >布尔运算符与按位运算符

布尔运算符与按位运算符
EN

Stack Overflow用户
提问于 2010-10-02 16:52:03
回答 9查看 49.5K关注 0票数 86

我对何时应该使用布尔运算符还是按位运算符感到困惑。

  • and vs &
  • or vs |

有没有人能告诉我,我什么时候使用它们,什么时候使用它们会影响我的结果?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-10-02 16:56:33

以下是一些指导原则:

  • 布尔运算符通常用于布尔值,但按位运算符通常用于整数values.
  • Boolean运算符是短路运算,但按位运算符不是short-circuiting.

短路行为在如下表达式中很有用:

代码语言:javascript
复制
if x is not None and x.foo == 42:
    # ...

使用按位&运算符时,这将无法正常工作,因为将始终计算两端,从而得到AttributeError: 'NoneType' object has no attribute 'foo'。使用布尔型and运算符时,如果第一个表达式为False,则不会计算第二个表达式。类似地,如果第一个参数为真,则or不会计算第二个参数。

票数 91
EN

Stack Overflow用户

发布于 2010-10-02 17:16:23

理论上,andor直接来自布尔逻辑(因此对两个布尔值进行操作以产生布尔值),而&|将布尔and /或应用于整数的各个位。关于后者到底是如何工作的,这里有很多问题。

以下是可能会影响您的结果的实际差异:

  1. andor短路,例如True or sys.exit(1)不会退出,因为对于第一个操作数(True or ...False and ...)的某个值,第二个操作数不会更改结果,因此不需要计算。但是|&不会让你走投无路-- True | sys.exit(1)把你踢出了REPL.
  2. &|是常规运算符,可以被重载,而andor则被伪造到语言中(尽管强制布尔值的特殊方法可能会有副作用)。这也适用于带有运算符overloading

的其他语言

  1. andor返回操作数的值,而不是TrueFalse。这不会改变条件中布尔表达式的含义-- 1 or True1,但1也为真。但它曾经被用来模拟条件运算符(C语法中的cond ? true_val : false_val,Python语言中的true_val if cond else false_val )。对于&|,结果类型取决于操作数如何重载各自的特殊方法(True & FalseFalse99 & 73,对于集合则是联合/交集...)。这也适用于其他一些语言,如,Perl
    • Javascript

但是,即使a_boolean & another_boolean的工作方式相同,正确的解决方案也是使用and --因为andor与布尔表达式和条件相关联,而&|则代表位翻转。

票数 25
EN

Stack Overflow用户

发布于 2014-09-20 22:07:03

这里还有一个更深层次的区别,这让我困惑了一段时间:因为& (和其他按位运算符)比and (和其他布尔运算符)具有更高的优先级,所以下面的表达式计算出不同的值:

代码语言:javascript
复制
0 < 1 & 0 < 2

对比

代码语言:javascript
复制
0 < 1 and 0 < 2

也就是说,第一个函数生成False,因为它等同于0 < (1 & 0) < 2,因此是0 < 0 < 2,因此是0 < 0 and 0 < 2

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3845018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档