簡體   English   中英

按位OR和邏輯OR運算符。 有什么不同?

[英]Bitwise OR and logical OR operators. What's the difference?

以下代碼中的邏輯運算符和位運算符之間是否存在任何功能差異? 使用這一個或另一個的原因是什么?

typedef unsigned char BOOLEAN;

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

  ...  
}

“支持”是什么意思?

如果它是合乎邏輯的或你的意思,那么當然你應該總是使用|| 因為那是布爾,邏輯,“或”運算符。

它具有能夠短路的優點,但這在代碼中並不重要,這很簡單。

我認為它是奇怪的和奇怪的(並且由於糾正)如果按位或當點不操作位時使用。

布爾值|| 將短路:如果第一個操作數為true ,則第二個操作數將永遠不會被評估。 相反,按位| 總是評估兩個參數。

其他答案已經討論過短路(但這不是您特定代碼中的問題)。 但這是一個關鍵的區別。

如果由於某種原因,您的輸入值不在[0,1]中,那么按位OR將給出一個也可能不在[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永遠不會被評估。

在下列情況下,邏輯運算符和按位運算符之間是否存在任何功能差異?

是的,有(其他人指出的懶惰eval)。

有理由支持其中一個嗎?

如果它們在某種程度上是等價的,那么使用邏輯運算符的情況就是保留該類型所預期的語義。 另見: 最不驚訝的原則

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM