2012-02-13 68 views
5

這是由this question直接啓發。
有很多引用/聲明,位運算符應用於布爾值時不會短路。換句話說,boolean a = f() & g(),其中f()g()都返回布爾值,兩個總是會被評估。
然而,JLS只是說:什麼(在規格中)保證「非短路邏輯運算符實際上不會短路?

15.22.2布爾邏輯運算符&,^和|
當兩個操作數的一個&,^或|運算符是布爾類型或布爾類型,那麼位運算符表達式的類型爲布爾型。在所有情況下,操作數 必要時都會進行拆箱轉換(§5.1.8)。

對於&,如果兩個操作數值均爲true,則結果值爲true; 否則,結果是錯誤的。

對於^,如果操作數值不同,則結果值爲真; 否則,結果是錯誤的。

對於|,如果兩個操作數值均爲false,則結果值爲false; 否則,結果是真實的。

這是如何保證兩個操作數都被實際評估的?除了xor之外,如果其中一個參數(並且可能是秒/右首先被評估)違反條件,您仍然能夠中斷並返回結果。例如:
例如。 a & b只需將b評估爲false即可將表達式評估爲false。

請注意:我不是問它是否以這種方式實現(不短路) - 當然是。

我問:

將與短路執行它違反語言 標準?

+0

是的。標準文本說明兩個操作數值的值,即兩個表達式都需要被消除。 – rsp 2012-02-13 19:25:43

回答

4

JLS 15.7.2 Evaluate Operands before Operation

Java編程語言也保證了操作人員的操作數的每個(除了有條件的經營者& &,||和?:)出現在操作的任何部分前應充分評估本身被執行。

所以,如果你有運營商&操作數需要計算最終結果之前進行評估。

此外,之前的部分明確要求首先評估任何二元運算符的左操作數。

+0

好抓!謝謝! – wmz 2012-02-13 19:57:10

+0

讓我印象深刻_finding_這一節。 – 2012-02-13 20:37:48

1

JLS明確指出,快捷方式是針對條件 - 或條件 - 和。它解釋了條件 - 或/和按位或/和操作符的行爲。所以,它強調的是,快捷鍵是位運算符的行爲變化。

所以,我會說使用捷徑會違反標準。這肯定會違反開發者的期望。

15.24條件或運算符||

的& &操作就像&(§15.22.2),但評估其右邊的操作數只有在其左側操作數的值是true。