[英]Pre/Post increment operators and arrays
我正在尝试以下Java代码段:
int[] testArray={10,20,30,40};
int i= 0;
testArray[i++]= testArray[i++]+1;
System.out.println("The value of i: "+i);
for(int i1=0;i1<testArray.length;i1++)
{
System.out.println(testArray[i1]);
}
当i = 0时,数组的输出值为: 21, 20,30,40
我无法理解此输出,因为输出应为: 10, 11, 30, 40
testArray[0]+1
将为11
,然后将其分配给testArray[1]
但事实并非如此。 有人可以解释输出吗?
在以下作业中:
testArray[i++] = testArray[i++] + 1;
首先,对i++
的值求值,结果为0
。 然后, i
的值增加。 因此,在RHS开始评估之前, i
的值已变为1
。 因此,基本上,以上表达式等效于:
testArray[0] = testArray[1] + 1;
在上面的表达式之后, i
的值为2
。 但是,如果将表达式更改为:
testArray[i] = testArray[i++] + 1;
..您将获得预期的结果。
当您这样做时:
testArray[i++] = testArray[i++] + 1;
这里发生很多事情。
test[i]
被评估 i
越来越 testArray[i]
新的值i
)被评价 testArray[i]
testArray[i]
(再次是new i
)。 您可能想做的是:
testArray[i] = testArray[i++] + 1;
这个:
int i= 0;
testArray[i++]= testArray[i++]+1;
等效于:
int i= 0;
testArray[0]= testArray[1]+1;
等效于:
int i= 0;
testArray[0]= 20 + 1;
后递增运算符正在增加int
的值,导致它拉动表达式中索引1中的元素,该索引==
20。显然,随后的加法将得出值21,然后将其分配给的索引0。数组。
换句话说,它与您的代码描述有关。 您没有使用假设的数组索引。
原因是因为当您编写该行时
testArray[i++]= testArray[i++]+1;
您首先使用
testArray[i++]
您访问数组的第一个条目,因此为testArray [0]。 通话结束后,我会升至1。
testArray[i++]+1
您可以在testArray [1]处获得该值(所以20),并将其加1。
这个:
这个:
int i= 0;
testArray[i++]= testArray[i++]+1;
***“执行此代码后,i == 2”
诸如此类的语句就是操作的顺序。 [ ]
优先级高于++
,因此testArray[i++]
意思是在索引i处输入数组,执行您要执行的所有操作,然后递增i。 即使它对您要完成的任务毫无用处,但在任务右侧完成所有操作后,最后发生的事情是我再次“递增”:)
最初, i=0
testArray[i++] = testArray[i++]+1;
对于左侧的表达式:
testArray[0]
(整数值10)是我们输入数组的地方(最终结果在这里!)。 然后,我增加到1
“等于”
对于右侧的表达:
使用我们新增加的i变量...
testArray[1]
(即整数值20)添加到文字整数值1,然后将结果(即21)存储在testArray[0].
最后,右侧表达式中的i增加到2。
或者,我们可以说:
i=0;
testArray[i] = testArray[i+1] + 1;
但是说实话,那有什么乐趣呢?
只是为了练习,请在i上使用前缀符号编写相同的代码段,然后看看会发生什么! 然后阅读与操作顺序相关的“关联性”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.