2014-09-26 96 views
7

什麼時候您需要使用非短路邏輯運算符或?換句話說...邏輯運算符或無短路

什麼時候使用

if(x == 1 | x==2) 

而不是

if(x == 1 || x==2) 

如果第一個條件是真的......那麼整個語句已經成爲事實。

更新:和&同樣的問題,& &

+0

你想知道這個「布爾類型」?對於整型類型,邏輯或運算符本身非常有用,但短路運算不是一種替代方案,因爲它不能對整型進行操作。 – 2014-09-26 02:04:13

+0

在這裏看到答案:http://stackoverflow.com/questions/9264897/reason-for-the-exsistance-of-non-short-circuit-logical-operators – Halogen 2014-09-26 02:22:27

回答

8

一個例子出現,如果我們有兩個功能,我們希望他們既要執行:

if (foo() | bar()) 

如果我們使用||,然後如果foo()返回true,則bar()將不會執行,這可能不是我們想要的。 (雖然這是有些晦澀案件,並且往往不是||的更合適的選擇)

類似的情況可以想出&/&&

if (foo() & bar()) 

如果我們使用了&&,那麼bar()將不會執行,如果foo()返回false,這再次可能不是我們想要的。

+0

也當你有if(x == 1 | x ++ > 2)... – 2014-09-26 02:03:52

+0

@shinjw更新回答。 – arshajii 2014-09-26 02:05:35

4

好吧,有幾個原因。看看下面的例子:

if(someImportantMethod() | otherImportantMethod()) 
{ 
    doSomething(); 
} 

如果您需要這兩種方法來運行,不管其他方法的結果,那麼你不得不使用|而不是||

需要注意的是短路操作數稍微慢一些(儘管性能影響通常不可忽略)。

2

根據你的問題,

如果你使用「|」運算符如「if(x == 1 | x == 2)」,對兩個表達式進行求值並且如果至少有一個TRUE值,則運行if塊的主體

如果使用「||」如果「if(x == 1 || x == 2)」,第一個表達式被評估,並且如果它返回TRUE,則不會評估第二個表達式並運行if塊的主體,如果使用「&」操作符,如「如果(X == 1 & X == 2)」,既表達式進行求值,並且如果兩個表達式都返回TRUE值,則運行的,如果塊

如果使用「& &身體「運算符」如果(x == 1 x == 2)「,則評估第一個表達式,如果它返回FALSE,則不會評估第二個表達式並且不運行if塊的主體

此外,「||」和「& &」可以用來節省您的應用程序的運行時間

1

我問Josh Bloch自己這個問題一次,他給了另一個可能的原因,IIRC:表現。非短路版本沒有分支。如果第二個操作數非常便宜,第一個操作數幾乎總是真的,那麼避免對第二個操作數進行條件評估可能會更快,並且讓處理器無需等待即可執行。