這是由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。
請注意:我不是問它是否以這種方式實現(不短路) - 當然是。
我問:
將與短路執行它違反語言 標準?
是的。標準文本說明兩個操作數值的值,即兩個表達式都需要被消除。 – rsp 2012-02-13 19:25:43