为什么此功能打印出它的功能?

时间:2018-11-08 07:07:43

标签: java

如果fg的定义如下:

void f(int[] x, int[] y, int p, int q) {
    for (int i = 0; i < x.length; ++i) {
        x[i] = 2 * x[i];
    }
    x = new int[5];
    for (int i = 0; i < 5; ++i) {
        x[i] = 0;
    }
    y[3] = 5;
    p = q + 1;
}

void g() {
    int[] x = {1, 2, 3, 4};
    int[] y = {9, 7, 6, 5};
    f(y, x, y[0], x[0]);
    for (int p : x) {
        System.out.print("" + p + " ");
    }
    for (int q : y) {
        System.out.print("" + q + " ");
    }
    System.out.println();
}

然后,如果您运行g(),它将显示1 2 3 5 18 14 12 10,我不知道为什么。

pq甚至如何加入方程式?

2 个答案:

答案 0 :(得分:0)

p和q只是在for循环中使用的变量。 这里的代码使用了“ for each loop”,是“ for loop”的变体。

在**对于每个循环**中,我们声明的变量与数组或集合的基本类型具有相同的数据类型,而不是声明和初始化循环计数器变量,后跟分号,即然后是数组或集合名称。

要了解每个循环的工作原理,请查看此答案-> How does the Java 'for each' loop work?

答案 1 :(得分:0)

  

typedef std::array<std::array<Point, YDimSize>, XDimSize> Grid; Grid grid; void something(Grid &grid) { ... p甚至如何加入方程式?

假设您要询问方法q的参数:
由于Java is "pass-by-value"f是毫无意义的陈述。


由于相同的原因,以下代码也没有意义,因为将p = q + 1;重新分配给了新数组,对x的更改不会影响调用方中的值。

x

大部分混乱是由x = new int[5]; // caller is unaffected by this for (int i = 0; i < 5; ++i) { x[i] = 0; // meaningless, since new int[5] is pre-initialized to all zeroes } x的交换引起的。方法y在方法{{1}中被称为f(x, y),因此f的f(y, x)实际上是g的g

为帮助区分它们,让我们将x的参数重命名为yf。然后,新代码(删除无意义的语句和参数)为:

a

如您所见,它将第一个参数的值加倍,并将第二个参数的第4个(索引3)值更改为b

这意味着方法g中的方法调用void f(int[] a, int[] b) { for (int i = 0; i < a.length; ++i) { a[i] = 2 * a[i]; } b[3] = 5; } 5的值加倍并将f(y, x)更改为y

x[3]成为5
x = {1, 2, 3, 4}成为x = {1, 2, 3, 5}

哪个导致打印输出:y = {9, 7, 6, 5}