首页 > 解决方案 > 偶数位置的Java数组产品

问题描述

所以,例如我有一个数组:int[] {1,2,3,4,5}。我需要打印偶数位置的产品,0位置将被认为是偶数,所以它将是:1 * 3 * 5 = 15。当我对数组求和时,我正在做这样的事情:

int sum = 0;
for (int i = 0; i < arr.length; sum += arr[i++])

我收到了正确的答案。

现在,我想到了使用相同的方法来获取产品:

int produs = 1;
for (int i = 0; i < arr.length; produs *= arr[i = i + 2])

在这里我总是得到一个错误。我不知道为什么,但如果我这样做:

int produs = 1;
for (int i = 0; i < arr.length; i++) {
    if ( (i & 1) == 0) {
        produs *= arr[i];
    }
}

或者

int produs = 1;
for (int i = 0; i < arr.length; i = i + 2) {
  produs *= arr[i];
}

我也得到了正确的答案。

所以,我的问题是为什么我的 inline for 方法不起作用?

int produs = 1;
for (int i = 0; i < arr.length; produs *= arr[i = i + 2])

这个。

标签: javaarraysfor-loop

解决方案


如果执行后缀自增操作,编译器会将旧值放入堆栈,例如

int[] arr = new int[] { 0, 10, 20, 30 };
int i = 0;
int x = arr[i++]; // x will be 0, i is incremented to 1

另一方面,如果您使用前缀递增操作,编译器会将新值放入堆栈,例如

int[] arr = new int[] { 0, 10, 20, 30 };
int i = 0;
int x = arr[++i]; // x will be 10, i is incremented to 1

最后,变量赋值操作将结果值放入堆栈,例如

int[] arr = new int[] { 0, 10, 20, 30 };
int i = 0;
int x = arr[i = i + 3]; // x will be 30, i is increased by 3

因此,如果您使用arr[i = i + 2]as post-block 语句,您实际上会访问以下数组元素:2, 4, 6,产生一个ArrayIndexOutOfBoundsException.

我强烈建议(也是为了便于阅读)重构算法以使用for-block 进行实际计算并使用 post-block 语句来增加变量i

for (int i = 0; i < arr.length; i+=2) {
    // TODO Calculation
}

推荐阅读