[英]Java: weird behavior of conditional operator
我有一個非常簡單的 java class 來解決使用遞歸方法的解碼方式。 我看到條件運算符的這種奇怪行為,
package decodeways;
public class Solution {
public static void main(String[] args) {
System.out.println(numDecodings("1456"));
}
public static int numDecodings(String s) {
if(s.length()>0 && s.charAt(0)=='0')
return 0;
if(s.length()==0) return 1;
if(s.length()==1)
return 1;
int num1 = s.charAt(0)-'0';
int num2 = s.charAt(1)-'0';
int one = numDecodings(s.substring(1));
int two = s.length()>1?numDecodings(s.substring(2)):0;
int res = one
+ num1<3 && num2<7 ? two:0;
return res;
}
}
如果我放括號, (num1<3 && num2<7? two:0)
那么一切都很好,但是如果我刪除括號,則會得到不正確的結果。
在調試過程中,一個會被計算為1,兩個會被計算為1,帶括號的res也是1,但是沒有括號,res的計算結果會是0(附上截圖),這是錯誤的來源. 我知道 java 中的運算符優先級,但在這種情況下,我無法弄清楚為什么它顯示不正確的行為,因為在下面的代碼中:
int res = one
+ num1<3 && num2<7 ? two:0;
one + num1<3 是非法的因此,java 足夠智能,不會混淆 (one + num1<3) 和 (num2<7? two:0) 之間的混淆,需要單獨考慮。 因此,根據我的理解,java 編譯器唯一合法的可觀察行為是自動考慮num1<3 && num2<7? two:0
num1<3 && num2<7? two:0
作為原子操作(如果我錯了,請糾正我),無論括號是否可用。
請指導我更好地理解。
謝謝。
int res = one
+ num1<3 && num2<7 ? two:0;
相當於
int res = (((one + num1) < 3) && (num2 < 7)) ? two : 0;
之前的一切?
包含在 boolean 表達式中,因為這里三元/條件運算符的優先級最低(不包括賦值運算符),而+
的優先級最高。
順序如下:
+
,所以one + num1
先放在一起<
,所以現在有(one + num1) < 3
和num2 < 7
&&
,之后你有((one + num1) < 3) && (num2 < 7)
?:
您似乎期望換行符使編譯器one
num1<3 && num2<7? two:0
num1<3 && num2<7? two:0
是分開的,但它實際上只是忽略了所有空格。 將括號放在那里one
確保將括號添加到條件運算符評估的任何內容的唯一方法。
int res = one + (num1 < 3 && num2 < 7 ? two : 0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.