为什么 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
我(错误地)认为有这些选项:
i = i(=1) + a[i++]
+ etc - 意味着 i = 1 被缓存而不是
然后改变了。表达式求值顺序正好是从左到
对,我猜 (?!).
- i 增加,这导致(对于第一个示例)现在
i = i(=3) + a[1] + a[2]
i = 3 并写入最左边的 i
- 最右边 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。
我完全不知道为什么会得到这些结果:
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
我(错误地)认为有这些选项:
i = i(=1) + a[i++]
+ etc - 意味着 i = 1 被缓存而不是 然后改变了。表达式求值顺序正好是从左到 对,我猜 (?!).- i 增加,这导致(对于第一个示例)现在
i = i(=3) + a[1] + a[2]
i = 3 并写入最左边的 i - 最右边 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。