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

Pab*_*run 6 c

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

typedef unsigned char BOOLEAN;

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

  ...  
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 9

"支持"是什么意思?

如果它是合乎逻辑的或者你的意思,那么当然你应该总是使用,||因为那是布尔,逻辑,"或"运算符.

它具有能够短路的优点,但这在代码中并不重要,这很简单.

我认为它是奇怪的和奇怪的(并且由于纠正)如果按位或当点不操作位时使用.


Rus*_*ser 7

布尔值|| 将短路:如果是第一个操作数true,则永远不会评估第二个操作数.相反,按位| 总是评估两个参数.


Oli*_*rth 7

其他答案已经讨论过短路(但这不是您特定代码中的问题).但这是一个关键的区别.

如果由于某种原因,您的输入值不在[0,1]中,那么按位OR将给出一个也可能不在[0,1]中的答案.逻辑OR 保证给你0或1.

因此,您应该更喜欢逻辑OR.您的意图(可能)是操纵逻辑值,因此使用非逻辑运算符是不合逻辑的.*


*双关语绝对有意.