Java && || 在RETURN语句中?

我正在看一些Java算法示例,我在递归方法中遇到了这个代码片段:

boolean subTree(TreeNode t1, TreeNode t2) { if (t1 == null) { return false; } if (t1.value == t2.value) { if (treeMatch(t1, t2)) return true;; } return (subTree(t1.left, t2) || subTree(t1.right, t2)); } 

不知道(也从未见过)|| 在之前的返回语句中使用,更不用说递归语句了,真让我感到困惑。 我将代码复制到Eclipse中以查看它是否有效。 然后我替换了|| 用&&​​和Eclipse似乎并没有被它打扰。 从逻辑上讲,我理解这个递归代码应该继续沿着TreeNode t1的左右子树,但我正在寻找关于这种Java语法如何工作的更多理论解释。

有人可以解释||背后的含义 和Java的返回声明中的&&? 在递归方面它意味着什么? 它与递归一起使用时才有意义吗?

如方法签名中所定义,您必须返回一个boolean 。 因此,在return关键字之后,您将必须提供一个boolean 或一个被计算为boolean 的表达式

在你的情况下你有exces (subTree(t1.left, t2) || subTree(t1.right, t2)); 其中两个操作数将被计算为boolean ,只有当第一个求值为false才会对它们应用逻辑OR 。 如果第一个操作数的计算结果为true ,则不会计算第二个操作数,并且将返回true

它们以相同的方式工作,无论是否存在递归语句。 在你的表达中:

 (subTree(t1.left, t2) || subTree(t1.right, t2)) 

如果对subTree(t1.left, t2)的第一次调用求值为true ,则不会调用或尝试计算第二个表达式。 这只是||的标准短路行为 和&&运算符,以及运算符如何处理赋予它们的任何参数。

这是将返回布尔值的逻辑或运算符

  return (subTree(t1.left, t2) || subTree(t1.right, t2))// return boolean value 

和&&也写了你的布尔值

 return (subTree(t1.left, t2) && subTree(t1.right, t2))// return boolean value 

两个运算符与数学逻辑相同

Java的return由方法体定义的单个值。 如果你认为它是一个generics函数(它不是,但它有助于理解),它就像你的例子中的return(boolean result) 。 现在和任何其他方法一样,您可以进行内联计算,从而产生一个中间值,然后将其转发( 匿名调用)到Math.round(a + 0.5)这样的实际函数。

结合那个和

 final boolean result = subTree(t1.left, t2) || subTree(t1.right, t2); return result; 

 return (subTree(t1.left, t2) || subTree(t1.right, t2)); 

Ther只是布尔值和/或短路。

短路意味着它评估第一个操作数,然后仅在需要决定结果时才评估第二个操作数。 你知道,真的是|| x =真; false && x = false,无论x的值是多少,因此在这些情况下甚至不进行评估。

如果评估有副作用,并且您希望它们始终发生,那么您应该使用&或| 不使用短路,因此评估两个操作数。

 return (subTree(t1.left, t2) || subTree(t1.right, t2)); 

评估第一个子句subTree(t1.left, t2)然后第二个。

因此,节点一直到叶节点将进行评估,然后开始处理正在运行的节点的树(以及它的所有左节点)。

我将根据[Java语言规范]解释它:

return语句定义为:

 ReturnStatement: return Expression opt ; 

带有Expression的return语句尝试将控制权转移给包含它的方法的调用者; Expression的值成为方法调用的值

执行这样的return语句首先评估Expression

什么是表达:

表达式是由变量运算符和方法调用组成的构造,它是根据语言的语法构造的,其值为单个值

 return (subTree(t1.left, t2) || subTree(t1.right, t2)); 

让我们解构它:

 return Expression; //Statement Expression : (subTree(t1.left, t2) || subTree(t1.right, t2)) 

如前所述 – 表达式由方法调用 ,运算符等组成 – subTree

(方法调用子树的结果)逻辑运算符(方法调用子树的结果)

结果将是表达式的评估值。