【问题标题】:Java: weird behavior of conditional operatorJava:条件运算符的奇怪行为
【发布时间】:2020-05-27 21:50:08
【问题描述】:

我有一个非常简单的 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;
  }
}

如果我加上括号,(num1&lt;3 &amp;&amp; num2&lt;7 ? two:0) 那么一切都很好,但如果我删除括号,则会得到不正确的结果。

在调试过程中,one会被计算为1,2会被计算为1,res也会被计算为1带括号但不带括号, res 的计算结果将为 0(附有截图),这是错误的来源。 我知道 java 中的运算符优先级,但在这种情况下,我无法弄清楚为什么它显示不正确的行为,因为在下面的代码中:

int res = one 
        + num1<3 && num2<7 ? two:0;

one + num1num1<3 && num2<7 ? two:0 视为原子操作(如果我错了,请纠正我),无论括号是否可用。

请指导我更好地理解。

谢谢。

【问题讨论】:

  • conditional-operator 的行为与recursive-datastructures 没有任何关系。准确而不是乱加标签。请勿在此处发布文字图片。
  • @user207421 我不是发文字图片,只是想展示调试器的例程。我知道条件运算符不必对解决方案的递归方法做任何事情,只是想告诉这个问题的观众这个问题涉及递归理解。我看不出有任何错误或恶意。
  • @user 和recursion 也没有任何关系。 OP 的代码可能与递归有关,但运算符与递归无关。
  • @pkm 您发布了您的程序的图片。您的程序是文本。直接发文。制作图片和发布完全是浪费您的时间和我们的带宽。

标签: java conditional-operator


【解决方案1】:
int res = one 
        + num1<3 && num2<7 ? two:0;

等价于

int res = (((one + num1) < 3) && (num2 < 7)) ? two : 0;

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

顺序如下:

  • +,所以先把one + num1放在一起
  • &lt;,所以现在有 (one + num1) &lt; 3 和 num2 &lt; 7
  • &amp;&amp;,之后你有((one + num1) &lt; 3) &amp;&amp; (num2 &lt; 7)
  • 终于?:

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

int res = one + (num1 < 3 && num2 < 7 ? two : 0);

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 2010-12-16
    • 2012-02-29
    • 2011-04-05
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多