簡體   English   中英

Java:條件運算符的奇怪行為

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

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