以下代码中的逻辑运算符和按位运算符之间是否存在任何功能差异?使用这一个或另一个的原因是什么?
typedef unsigned char BOOLEAN;
void orOperatorsComparison(BOOLEAN bBar, BOOLEAN bFoo)
{
BOOLEAN bLogicalOr = (bFoo || bBar);
BOOLEAN bBitwiseOr = (bFoo | bBar);
...
}
答案 0 :(得分:9)
“支持”是什么意思?
如果它是合乎逻辑的或你的意思,那么当然你应该总是使用||
,因为那是布尔,逻辑,“或”运算符。
它具有能够短路的优点,但这在代码中并不重要,这很简单。
如果该点不是用于操作位,我会认为它是奇怪的和奇怪的(并且应该纠正),如果按位或正在使用它。
答案 1 :(得分:7)
布尔值||将短路:如果第一个操作数是true
,则永远不会评估第二个操作数。相反,按位|总是评估两个参数。
答案 2 :(得分:7)
其他答案已经讨论过短路问题(但这不是您特定代码中的问题)。但这是一个关键的区别。
如果由于某种原因,您的输入值不在[0,1]中,那么按位OR将给出一个也可能不在[0,1]中的答案。逻辑OR 保证给你0或1。
因此,您应该更喜欢逻辑OR。您的意图(可能)是操纵逻辑值,因此使用非逻辑运算符是不合逻辑的。 *
<小时/> * Pun绝对有意。
答案 3 :(得分:2)
在特定情况下,不,结果:
没有区别1 || 0 == 1
1 | 0 == 1
所有真相表都适用于此。
如果您正在谈论我们如何到结果,那么可以是一个区别。使用||
,您有一个短路机制:
BOOLEAN bFooBar = (bFoo||bBar) // if bFoo is TRUE, we never look at bBar
// vs
BOOLEAN bFooBar = (bFoo|bBar) // where we take into account both values
所以它的长短是,是的,你可以在某些情况下使用逻辑和按位运算符错误并得到相同的结果,但为什么你 永远 那样做?如果你知道这是错误的,并且你知道它可能导致错误,很难找到错误,那么使用语言为你应该完成的工作提供的工具。
答案 4 :(得分:1)
按位或运算符永远不会与逻辑运算符短路。也就是说,如果bFoo
为真,则永远不会评估bBar
。
答案 5 :(得分:1)
逻辑和按位之间是否存在任何功能差异 运营商在以下情况下?
是的,有(其他人指出的懒惰eval)。
支持其中一个的任何理由?
如果它们是等价的,那么使用逻辑运算符的情况就是保留该类型所预期的语义。另见:Principle of least astonishment。