![](/img/trans.png)
[英]Can't understand the output of the following Java expression. It should be just an exercise of operator precedence and associativity
[英]Differences between Java order of expression, operator precedence and associativity
我在考試中遇到了這個問題。
考試題:以下代碼片段的結果是什么?
3: var tiger = "Tiger";
4: var lion = "Lion";
5: final var statement = 250 > 338 ? lion : tiger = " is Bigger";
6: System.out.println(statement);
正確答案是
F. 由於第 5 行,代碼將無法編譯
解釋是:
- 代碼無法編譯,因為賦值運算符在此表達式中具有最高優先級。
- 三元運算符的兩邊必須具有相同的類型。 這個表達式無效,因為第二個賦值運算符的左邊不是變量,所以答案是選項 F。
- 請注意,如果問題在表達式周圍添加了顯式括號(Tiger = " is Bigger"),則選項 E 將具有正確的 output。
當我自己運行代碼時,出現編譯錯誤:
test.java:11: error: unexpected type
final var statement = 250 > 338 ? lion : tiger = " is Bigger";
^
required: variable
found: value
1 error
error: compilation failed
在征求第二意見后,閱讀 JLS 第15節,以及這些其他 SO 問題:
我提出了幾個理論:
有了新知識,我現在將嘗試解釋為什么第 5 行無法編譯:
250 > 338? lion: tiger
250 > 338? lion: tiger
,這是一個有效的表達式,但這個表達式的計算結果是一個值。 現在我會嘗試應用同樣的理論來解釋這段代碼的正確場景: final var statement = 250 > 338? lion: (tiger = " is Bigger");
final var statement = 250 > 338? lion: (tiger = " is Bigger");
考試提供的解釋是否落空了,還是我仍然不明白這段代碼是如何編譯的?
你是對的,他們說錯了,賦值運算符的優先級最低。
你是不正確的,他們從來沒有在任何地方提到“評估順序”(無論如何你已經展示過)。 顯示的代碼在評估順序很重要的地方沒有做任何事情。 作業與評估順序無關。
- 代碼無法編譯,因為賦值運算符在此表達式中具有最高優先級。
運算符優先級顯示:
9 > relational
2 ?: ternary
1 = assignment
這意味着要使用括號顯式顯示優先級,語句變為:
statement = ((250 > 338) ? lion : tiger) = " is Bigger";
- 三元運算符的兩邊必須具有相同的類型。 這個表達式無效,因為第二個賦值運算符的左邊不是變量,所以答案是選項 F。
三元運算符是((250 > 338)? lion: tiger)
,“雙方”指的是兩個賦值運算符。
正如它所說,“這個表達式無效,因為第二個賦值運算符的左側不是變量”。
- 請注意,如果問題在表達式周圍添加了顯式括號(Tiger = " is Bigger"),則選項 E 將具有正確的 output。
你自己已經確認過了。
要使用括號顯式顯示優先級,語句變為:
statement = ( (250 > 338) ? lion : (tiger = " is Bigger") );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.