可能是重复问题:
什么是 | 和 || 或运算符之间的区别?
逻辑 AND 和 OR:
(x & y)
(x | y)
条件与和条件或:
(x && y)
(x || y)
到目前为止,我只知道条件运算符。我知道它的作用并且知道如何在if语句中应用它。但是逻辑运算符有什么作用呢?
可能是重复问题:
什么是 | 和 || 或运算符之间的区别?
逻辑 AND 和 OR:
(x & y)
(x | y)
条件与和条件或:
(x && y)
(x || y)
到目前为止,我只知道条件运算符。我知道它的作用并且知道如何在if语句中应用它。但是逻辑运算符有什么作用呢?
我更喜欢将其称为“按位与条件”而不是“逻辑与条件”,因为“逻辑”的一般概念在两种情况下都适用。
x & y // bitwise AND, 0101 & 0011 = 0001
x | y // bitwise OR, 0101 | 0011 = 0111
x && y // true if both x and y are true
x || y // true if either x or y are true
编辑
根据广大需求,我还应该提到参数的求值方式不同。在条件表达式中,如果整个操作的结果可以由第一个参数决定,第二个参数将不会被求值。这被称为短路求值。位运算必须计算两侧才能得出最终值。
例如:
x.foo() && y.bar()
只有当x.foo()
评估为true
时,才会调用y.bar()
。反之亦然,
x.foo() || y.bar()
只有当x.foo()
计算结果为false
时,才会调用y.bar()
。
(x && y)
Python中的逻辑运算符`and`是懒惰求值的。只有在`x`为真时,才会对`y`进行求值。
(x & y)
不是惰性的。 y将始终被评估。
更新的答案 - 我原来的回答有误导和不完整之处。
首先,我应该为我对这个问题的评论和回复道歉。
在阅读规范后,按位运算符和条件运算符之间的区别变得不那么明显了。
&、^和|运算符被称为逻辑运算符。
对于整数运算:
1. &运算符计算两个操作数的按位逻辑与,|运算符计算两个操作数的按位逻辑或,^运算符计算两个操作数的按位逻辑异或。2. 这些运算不可能发生溢出。
根据第14.11节:
&&和||运算符被称为条件逻辑运算符。2. 它们也被称为“短路”逻辑运算符。
14.11.1
1. 当&&或||的操作数是bool类型,或者操作数是未定义适用的&或|运算符但定义了对bool的隐式转换的类型时,操作将按以下方式处理:2. 操作x&&y计算为x?y:false。3. 换句话说,首先评估并转换x为bool类型。4. 然后,如果x为true,则评估并转换y为bool类型,并将其作为操作的结果。5. 否则,操作的结果为false。6. 操作x || y计算为x?true:y。7. 换句话说,首先评估并转换x为bool类型。8. 然后,如果x为true,则操作的结果为true。9. 否则,评估并转换y为bool类型,并将其作为操作的结果。
14.11.2
当操作数为声明可应用的用户定义操作符&或者|的类型时,并且选择的运算符所在的类型为T,则必须满足以下两个条件:&
、|
和 ^
是重载运算符。对于两个布尔值,它们只是急切的(非条件)逻辑运算符(ECMA-364 §14.10.3)。 - Matthew Flaschen
&
是按位布尔运算符时,我来到了这里。没有通用的答案,你的开头句子完全是错误的。 - H H