Java:条件运算符的奇怪行为

pra*_*mod -2 java conditional-operator

我有一个非常简单的 java 类来使用递归方法解决解码方法。我看到条件运算符的这种奇怪行为,

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我加上括号,(num1<3 && num2<7 ? two:0)那么一切都很好,但是如果我去掉括号,就会得到不正确的结果。

在调试过程中,一个计算为1,两个计算为1,res也为1,带括号,但没有括号,res的计算结果将为0(附截图),这是错误的来源. 在此处输入图片说明 我知道 java 中的运算符优先级,但在这种情况下,我无法弄清楚为什么它显示不正确的行为,因为在下面的代码中:

int res = one 
        + num1<3 && num2<7 ? two:0;
Run Code Online (Sandbox Code Playgroud)

one + num1<3 是非法的 所以,java 足够聪明,不会混淆 (one + num1<3) 和 (num2<7 ? two:0) 来分别考虑。因此,根据我的理解,java 编译器唯一合法的可观察行为是自动将其num1<3 && num2<7 ? two:0视为原子操作(如果我错了,请纠正我),无论括号是否可用。

请指导我有一个更好的理解。

谢谢。

use*_*ser 5

int res = one 
        + num1<3 && num2<7 ? two:0;
Run Code Online (Sandbox Code Playgroud)

相当于

int res = (((one + num1) < 3) && (num2 < 7)) ? two : 0;
Run Code Online (Sandbox Code Playgroud)

之前的所有内容都?包含在布尔表达式中,因为三元/条件运算符在此处具有最低优先级(不包括赋值运算符)并且+具有最高优先级。

顺序是这样的:

  • +,所以one + num1先放在一起
  • <,所以现在有(one + num1) < 3num2 < 7
  • &&,之后你有 ((one + num1) < 3) && (num2 < 7)
  • 最后 ?:

您似乎希望换行符让编译器思考one并且num1<3 && num2<7 ? two:0是分开的,但它实际上只是忽略了所有空格。将括号放在那里是确保one添加到条件运算符计算结果的唯一方法。

int res = one + (num1 < 3 && num2 < 7 ? two : 0);
Run Code Online (Sandbox Code Playgroud)