java - 偶数位置的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])
这个。
解决方案
如果执行后缀自增操作,编译器会将旧值放入堆栈,例如
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
}
推荐阅读
- angularjs - 禁用 md 输入
- scrapy - 如何禁用 celery 任务日志
- ios12 - iPhone 充电时,iOS 12 会终止所有应用程序
- mysql - php mysql错误查询时显示在表上
- reactjs - 应用程序布局在首次运行时未正确呈现
- jms - Mule WMQ 连接未在队列管理器中传播
- django - set_lanuguage 没有改变整个网页的语言,并且错过了视图的重定向
- python - 名称“linear_model”未定义
- jquery - 什么更便宜?重建整个 HTML 表格或重新排序它的行?
- java - 如何使用条件在 Hibernate 中实现 Select 和 Count