为什么 i += i + a[i++] + a[i++] + a[i++] 结果是 8?

Why i += i + a[i++] + a[i++] + a[i++] results in 8?

我完全不知道为什么会得到这些结果:

    int i = 1;

    int[] a = new int[6];
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    a[3] = 3;
    a[4] = 4;
    a[5] = 5;

    i += i + a[i++] + a[i++]; 
   //i is 5

   i = 1;

   i += i + a[i++] + a[i++] + a[i++];
   // i is 8

我(错误地)认为有这些选项:

  1. i = i(=1) + a[i++] + etc - 意味着 i = 1 被缓存而不是 然后改变了。表达式求值顺序正好是从左到 对,我猜 (?!).
  2. i 增加,这导致(对于第一个示例)现在 i = i(=3) + a[1] + a[2] i = 3 并写入最左边的 i
  3. 最右边 a[THIS_VALUE] 的值被代入最左边的 i,并且永远不会进行最后一次递增。

但实际结果让我毫无头绪...

i += i + a[i++] + a[i++];

将 i 的原始值与表达式 i + a[i++] + a[i++] 的值相加,并将结果赋给 i.

相当于

i = i + i + a[i++] + a[i++];
    1 + 1 + a[1]   + a[2]    = 1 + 1 + 1 + 2 = 5

然后你将1赋值给i并计算:

i += i + a[i++] + a[i++] + a[i++];

相当于

i = i + i + a[i++] + a[i++] + a[i++];
    1 + 1 + a[1]   + a[2]   + a[3] = 1 + 1 + 1 + 2 + 3 = 8

需要注意的重要一点是,每个 a[i++] 递增 i,但在 i 的前一个值的索引处访问 a 的元素(即增量之前的值)。

因此第一个a[i++]returnsa[1](即使i增加到2),第二个a[i++]returnsa[2](即使 i 增加到 3)和第三个 a[i++] returns a[3](即使 i 增加到4).

注意 i++ 和 ++i 之间的区别很重要,当你使用 i++ 时它使用 i 值来计算操作然后递增 i,但是当你使用 ++i 时它递增 i 并计算操作.

还值得一提的是,i+=X 等于 i = i + X。

所以

i += i + a[i++] + a[i++]; 

等于

i = i + i + a[i++] + a[i++]

对于 i = 1 是

i = 1 + 1 + a[1] + a[2]

根据您的初始化,它将是:

i = 1 + 1 + 1 + 2

这就是你得到 i = 5 的方式。下一行也是如此。

实际上很容易,你使用 post 增量。 Post increment 在执行表达式后递增值,而 pre 在执行表达式之前递增。所以 i += i + a[i++] + a[i++] + a[i++];,是 1 += 1 + 1 + 2 + 3,第一次访问,使用 1,然后递增,下一次访问使用 2,然后递增,最后一次访问使用 3。