在 Java 中, 大家都知道 &
可以做逐位元 (bit-wise) 的運算, 不過您可能不知道的是, 如果 &
兩邊都是 boolean
或是 Boolean
的運算元, 那 &
就會變成邏輯運算器, 例如:
jshell> int a = 10
a ==> 10
jshell> a == 11 & a++ == 11
$2 ==> false
這個時候它的功能和 &&
近似, 但是有一點關鍵的差異, 就是 &
兩邊的運算元都一定會執行, 然後才根據執行結果作邏輯運算。因此, 上述的例子中, 雖然左邊的運算元 a == 11
是 fasle
, 已經可以確認邏輯運算的結果, 但是右邊的運算元 a++ == 11
還是會運算, 如果檢查 a
的值, 就會發現變 11 了:
jshell> a
a ==> 11
如果是使用 &&
運算器, 它會走捷徑, 只要左邊運算元的計算結果可以決定整個邏輯運算的結果, 就不會計算右邊的運算元, 例如:
jshell> int b = 10
b ==> 10
jshell> b == 11 && b++ == 11
$5 ==> false
jshell> b
b ==> 10
你會看到同樣的運算元, 但是改用 &&
後, 因為左邊的 b == 11
會得到 false
, 對 &&
運算來說已經能夠確認結果一定是 false
, 所以右邊的 b++ == 11
根本就不會執行, 最後 b
就仍然保留原值。
小結
本文的說明也同樣適用於 |
運算器, 許多 Java 教學都沒有提到這些位元運算器也可以當成邏輯運算器使用, 雖然並不建議這樣用, 不過若是看到別人的程式出現這種用法, 就不會覺得奇怪了。
Top comments (0)