[英]Priority of equality and conditional operators in java
我運行以下代碼片段
System.out.println(T1() ? F1() : T2() == T3() ? F2() : T4());
public static boolean T1() { System.out.println("true1"); return true; }
public static boolean T2() { System.out.println("true2"); return true; }
public static boolean T3() { System.out.println("true3"); return true; }
public static boolean T4() { System.out.println("true4"); return true; }
public static boolean F1() { System.out.println("false1"); return false; }
public static boolean F2() { System.out.println("false2"); return false; }
我得到了輸出
true1
false1
false
在評估等式運算符之前,已對第一個三元運算符進行了求值,但根據oracle文檔 ,等式運算符的優先級高於三元運算符,因此必須在三元運算符之前對等式運算符求值。
這樣的代碼行為的原因是什么?
條件運算符在語法上是右關聯的(它從右到左分組)。 因此,a?b:c?d:e?f:g表示與a b相同:(c?d:(e?f:g))。
在你的情況下:
T1() ? F1() : (T2() == T3() ? F2() : T4())
a b c d e
T1()
被評估為true,返回true,因此接下來僅評估F1()
。
你似乎誤解了優先級意味着什么。 ==具有比三元運算符更高優先級的事實並不意味着在表達式中首先評估所有==子表達式。 在某些情況下,優先級僅僅是省略括號的一種方法。
例如,表達式
a == b ? c : d
可能等於(a==b) ? c : d
(a==b) ? c : d
或a == (b ? c : d)
。 ==具有更高優先級的事實意味着它實際上等同於第一個。
在表達中
a ? b : c == d
沒有歧義,它總是相當於a ? b : (c == d)
a ? b : (c == d)
。 由於三元運算符被懶惰地評估,如果a
持有, c == d
從未評估。
永遠不會評估T2() == T3()
。 您的代碼等於:
if(T1()) {
System.out.println(F1());
}
else {
if(T2() == T3()) {
System.out.println(F2());
}
else {
System.out.println(T4());
}
}
在這里你清楚地看到為什么它永遠不會被評估 - 因為T1()
為真,而且從不輸入else
塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.