[英]What (in the specs) warrants that 'non short circuit logical operators will in fact not short circuit?
這直接受到這個問題的啟發。
有許多引用/聲明,當應用於布爾運算符時,按位運算符不會短路。 所以換句話說boolean a = f() & g()
,其中f()
和g()
都返回boolean, 兩者總是會被計算。
但是, JLS只說:
15.22.2布爾邏輯運算符&,^和|
當兩個操作數都是&,^或|時 operator的類型為boolean或Boolean,則按位運算符表達式的類型為boolean。 在所有情況下,操作數都根據需要進行拆箱轉換(第5.1.8節)。對於&,如果兩個操作數值都為真,則結果值為true; 否則,結果是錯誤的。
對於^,如果操作數值不同,則結果值為true; 否則,結果是錯誤的。
對於|,如果兩個操作數值都為false,則結果值為false; 否則,結果是真的。
這如何保證兩個操作數都被實際評估? 除了xor
之外,如果其中一個參數(並且它可能是第二個/右首先被評估)違反條件,您仍然能夠中斷並返回結果。
例如。 a & b
只需將b
評估為false即可將表達式計算為false。
請注意:我不是問它是否以這種方式實現(不會短路) - 當然是。
我在問:
短路實施會違反語言標准嗎?
Java編程語言還保證在執行操作本身的任何部分之前,操作符的每個操作數(條件運算符&&,||和?:)除外。
因此,如果您有運算符&
, 則需要在計算最終結果之前評估兩個操作數。
另外,在那之前的部分明確地要求首先評估任何二元運算符的左操作數。
JLS明確指出對條件 - 和條件 - 和。執行快捷方式。 它解釋了條件或/和按位或/和運算符的行為。 因此,它強調快捷方式是來自按位運算符的行為變化。
所以,我會說使用快捷方式會違反標准。 這肯定會違反開發者的期望。
15.24條件運算符||
&&運算符類似於&(§15.22.2),但僅當其左側操作數的值為true時才計算其右側操作數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.