7

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

typedef unsigned char BOOLEAN;

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

  ...  
}
4

6 回答 6

10

“支持”是什么意思?

如果它是逻辑的或您的意思,那么当然您应该始终使用||它,因为它是布尔、逻辑的“或”运算符。

它具有能够短路的好处,但这在这么简单的代码中并不重要。

如果按位或在不操作位时使用它,我会认为它很奇怪和奇怪(并且由于更正)。

于 2013-03-21T14:59:53.050 回答
7

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

于 2013-03-21T14:59:27.417 回答
7

其他答案已经谈到了短路(但这在您的特定代码中不是问题)。但这里有一个关键区别。

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

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


* 双关语绝对是有意的。

于 2013-03-21T15:02:36.377 回答
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

所以总而言之,是的,您可以在某些情况下错误地使用逻辑运算符和位运算符并获得相同的结果,但是您为什么要这样做呢?如果您知道它是错误的,并且您知道它会导致糟糕的、难以发现的错误,请使用该语言为您提供的工具来完成它们本来应该做的工作。

于 2013-03-21T15:08:21.790 回答
1

按位或运算符从不短路,而逻辑运算符则短路。也就是说,如果bFoo为真,bBar则永远不会被评估。

于 2013-03-21T15:00:18.560 回答
1

在以下情况下,逻辑运算符和按位运算符之间是否存在任何功能差异?

是的,有(正如其他人指出的懒惰评估)。

有任何理由支持其中一个吗?

如果它们在某种程度上是等价的,那么使用逻辑运算符的情况将是保留该类型预期的语义。另见:最小惊讶原则

于 2013-03-21T15:08:53.260 回答