Java练习说明打印输出

6
我正在尝试理解以下Java练习。即使运行调试器,我也不理解第二个和第三个输出的细节:
1, 2, 3, 4 1, 2, 4, 4 1, 2, 4, 8
我理解第一行打印的是原始数组,第二行打印了数组的第[2]个元素,第三行打印了第[3]个元素。下面是代码:
public class TR1
{
    public static void main(String[] args)
    {
        int[] v =  {1, 2, 3, 4 };
        print(v);
        x(v, v[2] - 1);
        print(v);
        x(v, v[3] - 1);
        print(v);
    }

    public static void x(int array[], int y)
    {
        array[y] = array[y - 1] * 2;
    }

    public static void print(int array[])
    {
        System.out.print(array[0]);
        for (int i = 1; i < array.length; i++)
            System.out.print(", " + array[i]);
        System.out.println();
    }
}

为什么输出的是8? - matrix
3
新手提出的好问题;-) - GhostCat
1
@GhostCat 我同意,我认为这是一个非常好的问题。 - EJoshuaS - Stand with Ukraine
3个回答

5
让我们简要介绍一下最开始发生的事情。您从这个数组开始:

1 2 3 4

没有什么惊奇的打印结果。
然后你运行:
x(v, v[2] -1 ) ... evaluates to

x(v, 3 - 1)    ... evaluates to

x(v, 2)

这将根据以下内容更改数组:

array[y] = array[y - 1] * 2;

让我们把 y 插入为 2(如上所示):
array[2] = array[1] * 2;

array[2] = 2 * 2;

导致:
1, 2, 4, 4

所以,真正的答案是:您甚至不需要调试器。一张纸、一支笔和一点思考比使用调试器更有效,可以揭示这里的“秘密”。

2

让我们看看这个方法是做什么的:

public static void x(int array[], int y)
    {
        array[y] = array[y - 1] * 2;
    }

它获取索引y-1处的值,将其乘以2,然后将结果分配给索引y
起始数组:{1,2,3,4}
使用v[2] - 1调用取出索引为2(即3)的值,并减去1,因此我们得到y = 2
根据我们之前所说,该方法获取索引1y-1)处的值,即2,将其乘以2,因此我们得到4,并将其分配给索引2y)。
当前数组:{1,2,4,4}
使用v[3] - 1调用取出索引为3(即4)的值,并减去1,因此我们得到y = 3
根据我们之前所说,该方法获取索引2y-1)处的值,即4,将其乘以2,因此我们得到8,并将其分配给索引3y)。
当前数组:{1,2,4,8}

1
非常好的解释,对于新手来说非常清晰易懂。非常感谢。 - matrix

1

print总是打印整个数组。xy在两次调用print之间对数组进行了更改。

请记住,v[x]只是一个整数。例如,v[2]最初只是3,因此v[2] - 1 = 2。因此,在第一次和第二次调用print之间修改了v[2]


非常感谢,我明白了,但是[3]最初是4,它打印出8。 - matrix
1
@matrix 实际上,当第二次调用 x 时,[3] 被更改为 8。第一次调用 x 时,[2] 被更改为 4。 - EJoshuaS - Stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接