我在Java中有以下代码:
public static boolean isRoundNumber(String s) {
System.out.println("the string is: "+s);
if (s.length() == 0) {
System.out.println("check 1");
return false;
}
if (s.length() == 1) {
System.out.println("check 2");
return Character.isDigit(s.charAt(0));
} else {
System.out.print("checking: " + s.charAt(0)+ " | ");
return (Character.isDigit(s.charAt(0))
&& isRoundNumber(s.substring(1)));
}
}
当我输入
public static void main(String[] args) {
System.out.println("the string is a round number: " + isRoundNumber("1x143"));
}
输出
the string is: 1x143
checking: 1 | the string is: x143
checking: x | the string is a round number: false
当我从Character.isDigit(s.charAt(0)) &&
案例中删除else
时,输出为
the string is: 1x143
checking: 1 | the string is: x143
checking: x | the string is: 143
checking: 1 | the string is: 43
checking: 4 | the string is: 3
check 2
the string is a round number: true
如果我不在退货中删除Character.isDigit(s.charAt(0))
,为什么该方法会停止(并给出正确答案)?
答案 0 :(得分:3)
如果我不在退货中删除
Character.isDigit(s.charAt(0))
,为什么该方法会停止(并给出正确答案)?
它停止,因为&&
运算符短路表达式:
return (Character.isDigit(s.charAt(0))
&& isRoundNumber(s.substring(1)));
使用&&
,如果第一个操作数(&&
之前的位)是false
,则永远不会评估第二个操作数 - 因此递归调用isRoundNumber
没有发生。仅当第一个操作数为&&
时,才会计算第二个操作数(true
之后的位)。
答案 1 :(得分:0)
如果我不在返回中删除Character.isDigit(s.charAt(0)),为什么该方法会停止(并给出正确的答案)?
因为&&
是短路运营商。当Java评估a && b
的值时,它首先评估a
。如果它是假的,它甚至不评估b
,因为无论b
的值是什么,结果总是为假。这就是为什么它不会调用isRoundNumber(s.substring(1))
:Character.isDigit(s.charAt(0))
为false,因为第一个字符是'x'。
请注意||
也是如此:如果a || b
为真,b
甚至不评估a
。因为无论b的值是什么,表达将是真实的。