考虑这个循环:
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吗?
有人可以解释一下这种操作顺序的误解吗?
答案 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;