2013-02-26 46 views
4

很少碰到&和|用其他代碼中的邏輯運算符代替||和& &。我做了一個快速的研究,因爲我從來沒有用過它們,也不知道它的用途。
A & & B表示如果A爲假,B將不會被評估,並且它將返回false。
A & B表示如果A爲假,則B將被評估,即使表單也將返回false。
當然這是與|和||。do |和&在Java中有什麼意義?

我的問題是:無論如何評估第二個成員是否有意義,如果第一個人確定評估?我可以想象一個代碼,第二個成員在clode中做了一些超級重要的邏輯,所以它應該被評估,但我懷疑這是不好的做法。是否足以讓| |和&是否存在?

從一個評論,以使其更清晰:我有一個節目是不是最佳的,並且運行良好或者不如說感覺:精心設計的,如果所有的邏輯成員都應該被評估。

+0

請看看按位AND,OR,XOR:http://www.vipan.com/htdocs/bitwisehelp.html – sulai 2013-02-26 13:07:45

+0

謝謝,我剛剛檢查了他們 – CsBalazsHungary 2013-02-26 13:10:22

+0

可能重複[爲什麼&&而不是]&( http://stackoverflow.com/questions/7331686/why-and-not) – nalply 2013-03-12 08:50:53

回答

6

你忘了bitwise operations

按位&運算符執行按位與運算。

按位|運算符執行按位包含的或運算。

但在這裏你可以找到例如,當無條件及運營商更好:

What are the cases in which it is better to use unconditional AND (& instead of &&)

+0

謝謝,我從來沒有在這個級別使用,誤解來自我當前項目的一些代碼,人們用它作爲「a!= null &blabla(a)「對我來說這沒有意義。 – CsBalazsHungary 2013-02-26 13:09:24

+0

@CsBalazsHungary,查看更新 – bsiamionau 2013-02-26 13:25:26

+0

感謝您的鏈接! – CsBalazsHungary 2013-02-26 13:26:09

5

單&和|不是邏輯運營商,他們是bitwise and logical運營商。

+1

他們是按位和邏輯運算符 - [spec](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22) – McDowell 2013-02-26 14:04:05

2

Bitwise and Bit Shift Operators

按位&運算符執行按位與運算。
按位運算符執行按位異或運算。
按位|運算符執行按位包含的或運算。

JLS 15.22. Bitwise and Logical Operators

位運算符和邏輯運算符包括AND運算&,異或運算符^,和或運算符|。 大段引用

enter image description here

+0

你爲什麼要屏蔽一些這樣的代碼,而不是複製和粘貼文本? – weston 2013-02-26 13:27:15

2

您可以使用|和&運營商爲你上面說的。一些靜態代碼分析儀會發出警告,因爲它可能會掩蓋可能存在的問題。在這種情況下,你真的想兩個條件進行評估,你可以這樣做:

boolean cond1=cond1(); 
boolean cond2=cond2(); 
boolean myCond=cond1 && cond2; 

,如果你只是用

boolean myCond=cond1()&cond2(); 

有人會「糾正」給你。 所以是的,有些地方你會使用&和|,但很可能它不是一個好主意,爲了清晰起見,你可以繞過它。

+0

是的,這是我發佈我的問題時唯一的猜測。但是我有這樣的感覺,即如果所有的邏輯成員都要被評估,那麼這個程序並不是最優的,並且運行良好(設計得更好)。 – CsBalazsHungary 2013-02-26 13:13:08

2

想象一下,如果B是一個你想要一直執行的函數,那麼它會很有用。

+0

是的,但正如我在編輯的問題中寫的那樣:這不就是程序結構不好的標誌嗎?如果有人改變了一些邏輯評估,我會說這是很常見的,這很容易成爲這種評估的犧牲品。 – CsBalazsHungary 2013-02-26 13:18:29

2

我認爲這可能是相當不錯的例子:

if (initializeConnectionA() & initializeConnectionB() & initializeConnectionC()) { 
    performOperation(); 
} else { 
    logger.warn("Not all modules are working properly"); 
} 

凡方法initializeConnection連接,即可能不全部工作的一些外部服務器。你可能不需要初始化它們,但是如果其中一些不起作用,你會被警告。

當然,它可能不是這個問題的最明確的解決方案,但這是&運算符可能有用的示例。

+0

對我來說,即使這個例子真的很好,它也有點臭。我的意思是如果你繼續使用這個&運算符,肯定會有一個新的人調試這個函數,肯定會通過將它重寫爲&&而造成bug。根據我的口味,我會清楚地分開初始化,併爲狀態製作一個單獨的檢查器。因此,如果有人觸及該計劃的這一部分,就不會錯過任何重要的計劃部分。 – CsBalazsHungary 2013-02-26 13:44:00

+0

我完全同意,我不會在我的生產代碼中這樣寫。 – 2013-02-26 14:01:58

+0

我認爲|和&運算符比||更有用和&&運營商,但更基礎,然後是後者,這是他們的優化版本。我認爲編程語言應該爲我們提供基本的操作員,如果可能的話,給我們額外的優化操作員。 – 2013-02-26 14:05:02