[英]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.