Java:Foreach 循环在 int 数组上无法按预期工作?

发布于 2024-11-08 00:59:50 字数 371 浏览 0 评论 0原文

我有一个非常简单的循环:

int[] positions = {1, 0, 0}

//print content of positions

for (int i : positions)
{
    if (i <= 0) i = -1;
}

//print content of positions

现在,我期望得到的是:

array: 1, 0, 0
array: 1, -1, -1

但我得到的是

array: 1, 0, 0
array: 1, 0, 0

……为什么?

亲切的问候, 海蜇

I've got a pretty simple loop:

int[] positions = {1, 0, 0}

//print content of positions

for (int i : positions)
{
    if (i <= 0) i = -1;
}

//print content of positions

Now, what I would expect to get is:

array: 1, 0, 0
array: 1, -1, -1

but instead I get

array: 1, 0, 0
array: 1, 0, 0

Just... why?

Kind regards,
jellyfish

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

童话里做英雄 2024-11-15 00:59:50

因为“i”是数组元素的副本,而不是对其的引用:)
的数组元素

您修改的是局部变量,而不是此代码等效于

for(int index = 0; index < array.length; index++) {

int i = array[index];
...
}

Because "i" is a copy of an array element and not a reference to it :)
You modify a local variable, not an array's element

this code is equivalent to

for(int index = 0; index < array.length; index++) {

int i = array[index];
...
}
悲喜皆因你 2024-11-15 00:59:50

这很简单。如果你写

int i = positions[0];

然后你通过值复制 positions[0] ,而不是通过引用。您无法修改 ipositions[0] 中的原始值。这同样适用于在 foreach 循环中分配 i

解决方案是不使用 foreach 循环

for (int i = 0; i < positions.length; i++)
{
    if (positions[i] <= 0) positions[i] = -1;
}

It's simple. If you write

int i = positions[0];

Then you copy positions[0] by value, not by reference. You cannot modify the original value in positions[0] from i. The same applies to assigning i within a foreach loop.

The solution is without a foreach loop

for (int i = 0; i < positions.length; i++)
{
    if (positions[i] <= 0) positions[i] = -1;
}
花落人断肠 2024-11-15 00:59:50

如果我们使用带有数组的增强型 for 循环,这种情况会在幕后发生:

int[] array = {1,2,3,4,5};
for($i = 0; $i<array.length; $i++) {
  int i = array[$i];
  // your statements
  if (i <= 0) i = -1;
}

$i 只是未命名内部循环变量的占位符。看看会发生什么:您为 i 分配了一个新值,但 i 在下一次迭代中加载了下一个数组项。

因此,实际上,我们不能使用增强 for 循环中声明的变量来修改底层数组。

参考:JLS 3.0,14.14.2

This happens behind the scenes if we use the enhanced for loop with arrays:

int[] array = {1,2,3,4,5};
for($i = 0; $i<array.length; $i++) {
  int i = array[$i];
  // your statements
  if (i <= 0) i = -1;
}

$i is just a placeholder for an unnamed internal loop variable. See what happens: you assign a new value to i but i is loaded with the next array item in the next iteration.

So, practically spoken, we can't use the variable declared in the enhanced for loop to modify the underlying array.

Reference: JLS 3.0, 14.14.2

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文