按位OR和逻辑OR运算符。有什么不同?

时间:2013-03-21 14:57:21

标签: c

以下代码中的逻辑运算符和按位运算符之间是否存在任何功能差异?使用这一个或另一个的原因是什么?

typedef unsigned char BOOLEAN;

void orOperatorsComparison(BOOLEAN bBar, BOOLEAN bFoo)
{
  BOOLEAN bLogicalOr = (bFoo || bBar);
  BOOLEAN bBitwiseOr = (bFoo | bBar);

  ...  
}

6 个答案:

答案 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