以下代码中的逻辑运算符和按位运算符之间是否存在任何功能差异?使用一种或另一种的原因是什么?
typedef unsigned char BOOLEAN;
void orOperatorsComparison(BOOLEAN bBar, BOOLEAN bFoo)
{
BOOLEAN bLogicalOr = (bFoo || bBar);
BOOLEAN bBitwiseOr = (bFoo | bBar);
...
}
以下代码中的逻辑运算符和按位运算符之间是否存在任何功能差异?使用一种或另一种的原因是什么?
typedef unsigned char BOOLEAN;
void orOperatorsComparison(BOOLEAN bBar, BOOLEAN bFoo)
{
BOOLEAN bLogicalOr = (bFoo || bBar);
BOOLEAN bBitwiseOr = (bFoo | bBar);
...
}
“支持”是什么意思?
如果它是逻辑的或您的意思,那么当然您应该始终使用||
它,因为它是布尔、逻辑的“或”运算符。
它具有能够短路的好处,但这在这么简单的代码中并不重要。
如果按位或在不操作位时使用它,我会认为它很奇怪和奇怪(并且由于更正)。
布尔值 || 将短路:如果第一个操作数是true
,则永远不会计算第二个操作数。相比之下,按位 | 总是评估两个参数。
其他答案已经谈到了短路(但这在您的特定代码中不是问题)。但这里有一个关键区别。
如果由于某种原因,您的输入值不在 [0,1] 中,那么按位或会给您一个可能也不在 [0,1] 中的答案。逻辑 OR保证给你 0 或 1。
因此,您应该更喜欢逻辑 OR。您的意图是(大概)操纵逻辑值,因此使用非逻辑运算符是不合逻辑的。*
在那种特殊情况下,不,结果没有区别:
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
所以总而言之,是的,您可以在某些情况下错误地使用逻辑运算符和位运算符并获得相同的结果,但是您为什么要这样做呢?如果您知道它是错误的,并且您知道它会导致糟糕的、难以发现的错误,请使用该语言为您提供的工具来完成它们本来应该做的工作。
按位或运算符从不短路,而逻辑运算符则短路。也就是说,如果bFoo
为真,bBar
则永远不会被评估。
在以下情况下,逻辑运算符和按位运算符之间是否存在任何功能差异?
是的,有(正如其他人指出的懒惰评估)。
有任何理由支持其中一个吗?
如果它们在某种程度上是等价的,那么使用逻辑运算符的情况将是保留该类型预期的语义。另见:最小惊讶原则。