如果f
和g
的定义如下:
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
,我不知道为什么。
p
和q
甚至如何加入方程式?
答案 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
的参数重命名为y
和f
。然后,新代码(删除无意义的语句和参数)为:
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}