2011-10-05 41 views
2

考虑这个循环:与数组索引工作时的操作顺序

int[] myArray = new int[10]; 

int myIndex = 0; 
for (int i = 0; i < 10; i++) 
{ 
    myArray[myIndex++] = myIndex; 
    Console.WriteLine(myArray[i]); 
} 

这产生了:

1 
2 
3 
... 

因为myIndex是后递增,右侧第一评估,不应该数组索引0包含0?

有人可以解释这种秩序操作误解我吗?

+1

哇!我也很震惊。这在C++中是一样的吗? –

回答

5

右侧不一定首先评估。类似于:

foo.Bar.Baz = a + b; 

在上面的代码,foo.Bar首先计算,然后a + b,则set_Baz方法被调用来设置巴兹属性到任何在右侧评价。

在你的代码

所以,如果你打破它成片,它看起来像这样:

var index = i; 
// post-incremented in the original code means this comes after the line above, 
// but not after the line below it. 
i += 1; 
myArray[index] = i; 
0

被设定的值之前myIndex ++被执行,因为数组索引需要precident所以它知道什么数组索引将该值设置为。

0

myIndex++首先计算,其次是左侧和最后的赋值运算符,根据优先级

2

第一运行:

myArray[myIndex++] = myIndex; 
      *   * 
      |   | 
     zero   one 

myIndex++得到myArray[myIndex++]之后执行,但与任何后续调用具有已经增加的变量。

0

的...

myArray[myIndex++] = myIndex; 

...是equivalend到...

int tmp = myIndex; 
++myIndex; 
myArray[tmp] = myIndex;