Java中的三元运算符混淆

0 java conditional-operator

我正在做 LeetCode 437 Path Sum III https://leetcode.com/problems/path-sum-iii/ ,我的原始代码如下,通过了所有测试:

public int pathSum(TreeNode root, int sum) {
        if (root == null) {
            return 0;
        }
        return pathSumStartWithRoot(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum);
    }
    
    private int pathSumStartWithRoot(TreeNode root, int sum) {
        if (root == null) return 0;
        int res = root.val == sum ? 1 : 0;
        return res
            + pathSumStartWithRoot(root.left, sum - root.val) 
            + pathSumStartWithRoot(root.right, sum - root.val);
    }
Run Code Online (Sandbox Code Playgroud)

我的困惑来自int res = root.val == sum ? 1 : 0;于私有方法。当我试图缩短我的代码时,我删除了这一行并将返回值更改为

    return root.val == sum ? 1 : 0 
   + pathSumStartWithRoot(root.left, sum - root.val) + pathSumStartWithRoot(root.right, sum - root.val);
Run Code Online (Sandbox Code Playgroud)

但是,此更改导致一些测试失败。例如,

树节点:[1,-2,-3,1,3,-2,null,-1],总和:-1

正确的输出应该是 4,但通过这个更改,输出是 3。

更令人惊讶的是,当我改变加法顺序时,说把三元放在最后:

        return pathSumStartWithRoot(root.left, sum - root.val) 
        + pathSumStartWithRoot(root.right, sum - root.val)
        + root.val == sum ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

输出更改为 2。

我真的不知道这里发生了什么。在我看来,添加的顺序应该与最终结果无关。我对三元运算符不是很熟悉,我猜这个问题可能是由于使用不当造成的?我在互联网上搜索了很多,但仍然找不到原因。感谢任何人的解释。

And*_*ner 5

在我看来

不幸的是,您的意见与编译器无关。

int a = condition ? 1 : 0;
int b = a + c;
Run Code Online (Sandbox Code Playgroud)

相当于:

int b = (condition ? 1 : 0) + c;
Run Code Online (Sandbox Code Playgroud)

它不等同于:

int b = condition ? 1 : 0 + c;
Run Code Online (Sandbox Code Playgroud)

因为这与:

int b = condition ? 1 : (0 + c);
Run Code Online (Sandbox Code Playgroud)

由于+具有比 更高的优先级?:。(参见运算符优先级表)。

因此,如果要内联条件表达式,则需要使用括号来表示预期的优先级。

return (root.val == sum ? 1 : 0)
    // ^-----------------------^ Extra parens.
   + pathSumStartWithRoot(root.left, sum - root.val)
   + pathSumStartWithRoot(root.right, sum - root.val);
Run Code Online (Sandbox Code Playgroud)