2013-11-25 48 views
1

我尝试下面的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]+111一下子就被然后分配给testArray[1]但事实并非如此。 任何人都可以解释输出吗?

回答

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。

换句话说,它与您对代码的描述有关。你不使用你认为你的数组的索引。

5

在下面的分配:

testArray[i++] = testArray[i++] + 1; 

首先i++值进行评价,其出来是0。然后i的值递增。因此,在RHS开始评估之前,i的值已变为1。因此,基本上,上面的表达式是等效于:

testArray[0] = testArray[1] + 1; 

和上述表达式之后,的i的值将是2。但是,如果您将表达更改为:

testArray[i] = testArray[i++] + 1; 

..您将获得预期结果。

+0

什么是RHS?我不熟悉。 –

+0

@KevinBowersox右手边(数学术语):) –

+0

首先,RHS的评估是否正确?所以testArray [i ++] + 1首先被评估,并且当i = 1时它变成testArray [0] +1。最后testArray [1] = testArray [0] +1。为什么它错了? – Zephyr

1

当你这样做:

testArray[i++] = testArray[i++] + 1; 

许多事情在这里发生。

  • test[i]评价
  • i被递增
  • testArray[i](新的i值)获取评估
  • 1加到testArray[i]
  • 结果被分配回testArray[i](再次,新i) 。

你可能想要做的是:

testArray[i] = testArray[i++] + 1;

1

的原因是因为当你写行

testArray[i++]= testArray[i++]+1; 

您第一次访问与

testArray[i++] 

数组访问数组的第一个条目,所以testArray [0]。在此之后的呼叫i增加至1 当你然后说

testArray[i++]+1 

您得到了testArray值[1](所以20),并把它加1。

-1

这:

此:

int i= 0; 
testArray[i++]= testArray[i++]+1; 

*** “这代码执行后,我== 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; 

但说实话,那里是在的乐趣?

只是为了练习,我使用前缀符号代码相同的片段,看看会发生什么! 然后阅读关于“关联性”,因为它涉及到操作顺序。