调用方法时意外输出

时间:2015-01-13 04:10:23

标签: java

public class Sandbox {

    private static int arg;

    public static void main(String args[]) {
        for(int i = 99; i > 0; i--)
           doSomething(i);
    }

    public static void doSomething(int arg) {
        if(arg == 1 || arg == 2 || arg == 3) doSomething(--arg);
        if(arg == 1 || arg == 2 || arg == 3) System.out.println(arg);
        Sandbox.arg = arg;
    }

}

运行时的输出如下:

1
2
1

我预计这不会输出任何内容,为什么输出1,2& 3?

2 个答案:

答案 0 :(得分:2)

首先,消除你的哇Sandbox.arg

public static void main(String args[]) {
    for (int i = 99; i > 0; i--)
        doSomething(i);
}

public static void doSomething(int arg) {
    if (arg == 1 || arg == 2 || arg == 3)
        doSomething(--arg);
    if (arg == 1 || arg == 2 || arg == 3)
        System.out.println(arg);
    // Sandbox.arg = arg;
}

你仍然得到

1
2
1

你用99,1包含的每一个值来调用它。这包括3,2和1.

使用3

进行调用时
if(arg == 1 || arg == 2 || arg == 3) doSomething(--arg); //<-- recurse with "2"
if(arg == 1 || arg == 2 || arg == 3) System.out.println(arg); //<-- print "2"

显然是在使用2

进行调用时
if(arg == 1 || arg == 2 || arg == 3) doSomething(--arg); //<-- recurse with "1"
if(arg == 1) // <-- print "1".

因此,当arg为1然后为2(因为你预先创建了arg)时,你得到3的递归调用2。然后,您会在1的循环中为2获得另一个main()。显然,1 if arg使{{1}} 0。

答案 1 :(得分:0)

对于从99到4的i的值,条件if (arg == 1 || arg == 2 || arg == 3)保持为false,因此不执行任何操作。但是对于i=3, i=2, i=1,条件是正确的。

现在,对于i = 3,相同的函数doSomething(--arg);被递归调用,arg为--arg,即2.类似地,它被称为i = 1.

当调用递归函数时,当前变量实例存储在堆栈中。 一旦放置了i = 1的递归调用,则调用下一个语句System.out.println(arg);并打印1.现在弹出堆栈值,并且对于i = 2执行相同的语句,并且类似地对于i = 3。