簡體   English   中英

什么(在規范中)保證'非短路邏輯運算符實際上不會短路?

[英]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。

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

我在問:

短路實施會違反語言標准嗎?

請參閱JLS 15.7.2在操作之前評估操作數

Java編程語言還保證在執行操作本身的任何部分之前,操作符的每個操作數(條件運算符&&,||和?:)除外。

因此,如果您有運算符&需要在計算最終結果之前評估兩個操作數。

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

JLS明確指出對條件 - 和條件 - 和。執行快捷方式。 它解釋了條件或/和按位或/和運算符的行為。 因此,它強調快捷方式是來自按位運算符的行為變化。

所以,我會說使用快捷方式會違反標准。 這肯定會違反開發者的期望。

15.24條件運算符||

&&運算符類似於&(§15.22.2),但僅當其左側操作數的值為true時才計算其右側操作數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM