使用数组索引时的操作顺序

时间:2011-10-05 23:51:34

标签: c# arrays operator-precedence

考虑这个循环:

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吗?

有人可以解释一下这种操作顺序的误解吗?

5 个答案:

答案 0 :(得分:5)

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

foo.Bar.Baz = a + b;

在上面的代码中,首先评估foo.Bar,然后a + b,然后调用set_Baz方法将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;

答案 1 :(得分:2)

首先运行:

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

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

答案 2 :(得分:0)

myIndex ++在设置值之前正在执行,因为数组索引采用precident,因此它知道要将值设置为的数组索引。

答案 3 :(得分:0)

首先评估myIndex++,然后是左侧,最后是赋值运算符,根据优先级

答案 4 :(得分:0)

在...

myArray[myIndex++] = myIndex;

......等同于......

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