处理数组索引时的操作顺序

本文关键字:操作 顺序 数组 索引 处理 | 更新日期: 2023-09-27 18:10:27

考虑这个循环:

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

谁能给我解释一下对操作顺序的误解吗?

处理数组索引时的操作顺序

右边不一定先求值。类似于:

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;

第一次运行:

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

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

myindex++在值被设置之前执行,因为数组索引是预先设置的,所以它知道要将值设置到哪个数组索引

myArray[myIndex++] = myIndex;

…等于…

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

根据优先级

,首先计算myIndex++,然后是左侧,最后是赋值操作符。