gpt4 book ai didi

java - java中局部变量全局更新

转载 作者:行者123 更新时间:2023-12-01 22:34:29 25 4
gpt4 key购买 nike

我调用函数move,二维数组在点[6, 5]处全为零,其值为0 。该函数将值增加到1

然后同一个函数再次调用自身move(x - 1, y, map, i),这意味着它位于点[5, 5 ],值为0,它增加到1并自行结束。

但是为什么首先调用的函数中的 map 变量也被更新了?

private static byte[10][10] myMap = {*all zeros*};

public static void main(String[] args) {
move(6, 5, myMap, 0);
}

private static void move(int x, int y, byte[][] map, int i) {
if (map[x][y] == 0) {
map[x][y]++;
i++;
}
if (i > 1) return;

System.out.print(x + " " + y);
// 6 5
System.out.print(map[5][5] + " " + i);
// 0 1
move(x - 1, y, map, i);

System.out.print(map[5][5] + " " + i);
// 1 1 ... WTH? Shouldn't this return 0 1 like above?
}

当它更新 map 时,为什么它不更新i变量?

我花了好几个小时才找到原因,但仍然不知道:/感谢您的帮助

最佳答案

乍一看这可能会令人困惑,但是当您了解按引用传递和按值传递时,就很容易理解了。

数组变量包含对实际数组的引用。基本上它们被视为与对象相同。这意味着您正在更新提供给该函数的 map 。

int 变量是原始类型(intshortbytelong >、charfloatdouble,当然还有 boolean - 请注意名称中的首字母小写字符),在Java中是按值传递的。基本上制作了该值的副本。所以你永远不能使用这样的变量来返回任何值。如果您想这样做,您需要一个 return 语句。

<小时/>

例如:

// using depth first, then width!!!
private static byte[][] myMap = new byte[10][10];

public static void main(String[] args) {
move(6, 5, myMap, 0);
}

private static byte[][] cloneMap(byte[][] map) {
byte[][] newMap = new byte[map.length][];
for (int x = 0; x < map.length; x++) {
newMap[x] = map[x].clone();
}
return newMap;
}

private static void printMap(byte[][] map) {
for (int x = 0; x < map.length; x++) {
for (int y = 0; y < map[0].length; y++) {
System.out.printf("%3d ", map[x][y] & 0xFF);
}
System.out.printf("%n");
}
}

private static int move(int x, int y, byte[][] map, int i) {
if (map[x][y] == 0) {
map[x][y]++;
i++;
}
if (i > 1) return i;

System.out.printf("x: %d, y: %d%n", x, y);
// 6 5

printMap(map);
System.out.printf("i: %d%n", i);

// -- note, you may still be missing some way of storing the maps
map = cloneMap(map);
i = move(x - 1, y, map, i);

// System.out.println(map[5][5] + " " + i);
printMap(map);
System.out.printf("i: %d%n", i);
return i;
}

关于java - java中局部变量全局更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27077795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com