提问者:小点点

JAVA中Postfix递减中的StackOverFlow


这工作得很好,因为我们在递归调用中使用了前缀递减运算符!前缀递减:

 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--?不是为什么会发生这种情况!


共3个答案

匿名用户

    doubt1(num--);

在内部实施为

    int tmp = num;
    num = num - 1;
    doubt1(tmp);

也就是说,它使用原始值递归调用怀疑1方法,因此永远不会达到条件num==0

匿名用户

当您调用方法时,参数会被评估,并将结果值分配为方法参数的初始值。表达式num----numnum有相同的副作用,但这对方法调用无关紧要。这两个值计算为不同的值:前者计算为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相反,然后递减,然后调用怀疑