这工作得很好,因为我们在递归调用中使用了前缀递减运算符!前缀递减:
public static void main(String[] args) {
doubt1(5);
}
static void doubt(int num)
{
if(num==0)
return;
System.out.println(num);
doubt(--num);
}
后缀递减:
static void doubt1(int num)
{
if(num==0)
return;
System.out.println(num);
doubt1(num--);
}
但是当我们使用后缀递减时,它会导致堆栈溢出错误,我理解它为什么会导致错误,但我想知道,如果我们在递归调用中使用num-1
,它不会给出溢出错误,我的问题是-
想要解释为什么它在递归调用中计算num-1
而不是num--
?不是为什么会发生这种情况!
doubt1(num--);
在内部实施为
int tmp = num;
num = num - 1;
doubt1(tmp);
也就是说,它使用原始值递归调用怀疑1
方法,因此永远不会达到条件num==0
。
当您调用方法时,参数会被评估,并将结果值分配为方法参数的初始值。表达式num--
和--num
对num
有相同的副作用,但这对方法调用无关紧要。这两个值计算为不同的值:前者计算为num的值,然后递减,后者计算为num
的值,然后递减。运算符相对于操作数的顺序是助记符。
因此,与
int n = 1;
some_method(n--);
传递给some_method()
的值是1,但是
int n = 1;
some_method(--n);
传递给some_method()
的值为0。
然而,在这两种情况下,值0在some_method()
主体开始执行之前存储在n
中。
使用一元递减运算符,操作发生在语句之后或之前。
与表达式之后或之前相反。
所以,在这种情况下,num--
和--num
会有区别。
因此,怀疑(num--)
在call语句之后递减,而不是在参数表达式之后递减。
至于double(--num)
,情况正好相反,递减发生在参数表达式之前。
本质上,对于怀疑(num--)
,在编译器具有num
并准备调用怀疑
之后,它将递减num
。
与具有num
相反,然后递减,然后调用怀疑
。