为什么`--var`和`var-1`的工作方式不同?

Ayb*_*erk 3 java pre-increment

我写了一个代码来打印所有有效的n对括号组合.但是,在我第一次尝试时,算法输出所有组合两次,即.代码是:

public static void solve(char[] string, int open, int closed, int index)
{
    if (open < 0 || closed < open) {
        return;
    }

    if (open == 0 && closed == 0) {
        System.out.println(string);
    }

    if (open > 0) {
        string[index] = '(';
        solve(string, --open, closed, ++index);
    }

    if (closed > open) {
        string[index] = ')';
        solve(string, open, --closed, ++index);
    }
}
Run Code Online (Sandbox Code Playgroud)

我花了很多时间才能看出出了什么问题.我认为代码进入最后一个if分支比它应该更多.然后,在尝试不同的事情时,我意识到了变化

solve(string, --open, closed, ++index);
Run Code Online (Sandbox Code Playgroud)

solve(string, open-1, closed, ++index);
Run Code Online (Sandbox Code Playgroud)

改变了结果.这导致了一个java.lang.ArrayIndexOutOfBoundsException.最后,我用相应的算术运算(例如,++indexto index+1)替换了所有预增量操作,并且代码正确运行.

我的问题是,不应该--openopen-1计算和发送相同的值作为参数传递给函数?为什么代码在计算相同值时表现不同?

Joa*_*son 7

solve(string, --open, closed, ++index);
Run Code Online (Sandbox Code Playgroud)

实际上改变open为比之前少一个,这使得open下面的下一个使用的行为比传入的值少1.

solve(string, open-1, closed, ++index);
Run Code Online (Sandbox Code Playgroud)

...,另一方面通过open-1到解决方法,但并没有改变open,所以在后面的语句中使用时,它的使用保持不变.