[英]Why is a Java ternary “evaluated” before an or?
我有以下Java代碼片段,當我希望它返回true時返回false :
assertTrue(true || false ? false : false);
為了這篇文章(它最初使用的是字符串比較),該語句已被愚蠢了,我知道它可以簡化為不使用三元運算符,但基本上我想弄清楚為什么Java會像這樣評估它:
(true || false) ? false : false
而不是這個:
true || (false ? false : false)
我希望它能評估真實和退出。 有誰知道為什么不呢?
由於運算符優先級 。 邏輯AND和邏輯OR具有比三元運算符更高的優先級,因此它們首先起作用。
因為||
優先級高於?:
。 這是Java中的運算符表 。 ||
位置13,而?:
位於第14位。
因為這就是語言規范所說的。 語法的相關部分是
Expression:
Expression1 [AssignmentOperator Expression1]
Expression1:
Expression2 [Expression1Rest]
Expression1Rest:
? Expression : Expression1
Expression2:
Expression3 [Expression2Rest]
Expression2Rest:
{ InfixOp Expression3 }
instanceof Type
InfixOp:
||
&&
// and many other operators
所以解析A || B ? C : D
A || B ? C : D
A || B ? C : D
? C : D
? C : D
必須是Expression1Rest
,並且是||
的右側 必須是一個Expression3
,其不包括三元條件表達式(除非它被包裹在括號-一個括號表達式總是可接受的作為Expression3
)。 所以我們必須解析A || B
A || B
作為Expression3
,因此整個表達式就好像是(A || B) ? C : D
(A || B) ? C : D
。
因此,有一種叫做“ 運算符優先級 ”的東西。 它與數學中的操作順序概念相同。 就像數學+
來自*
,在Java中?:
來自||
。
為什么這樣? 好吧,我認為將三元擴展為if
語句會有所幫助:
true || false? false: false;
// literally maps to
if(true || false) false; else true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.