簡體   English   中英

為什么在三元組之前“評估”Java三元組?

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

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