增量运算符不会在for循环中递增
我正在做一些关于Java的研究,发现这非常混乱:
for (int i = 0; i < 10; i = i++) { System.err.print("hoo... "); }
这是永无止境的循环!
有人解释为什么会发生这种事
for (int i = 0; i < 10; i = i++) {
上面的循环基本上是一样的: –
for (int i = 0; i < 10; i = i) {
你的for
语句的第三部分 – i = i++
,被评估为: –
int oldValue = i; i = i + 1; i = oldValue; // 3rd Step
你需要从那里删除作业,使其工作: –
for (int i = 0; i < 10; i++) {
(来自评论的OP请求)
x = 1; x = x++ + x++;
行为x = 1; x = x++ + x++;
x = 1; x = x++ + x++;
: –
就评论中指出的问题而言,下列expression式的结果是: –
x = 1; x = x++ + x++;
得到如下:
我们来标记第二个陈述的不同部分:
x = x++ + x++; RAB
现在,首先对RHS部分(A + B)
进行评估,然后将最终结果分配给x
。 所以,我们继续前进。
首先评估: –
old1 = x; // `old1 becomes 1` x = x + 1; // Increment `x`. `x becomes 2` //x = old1; // This will not be done. As the value has not been assigned back yet.
现在,由于A
到R
的分配不在这里完成,所以不执行第三步。
现在,转到B
评估:
old2 = x; // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`) x = x + 1; // increment `x`. `x becomes 3`. // x = old2; // This will again not be done here.
现在,为了得到x++ + x++
的值,我们需要完成我们在评估A
和B
留下的最后一个任务,因为现在是在x
中分配的值。 为此,我们需要更换:
A --> old1 B --> old2 // The last assignment of both the evaluation. (A and B) /** See Break up `x = old1;` towards the end, to understand how it's equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/
所以, x = x++ + x++
变成: –
x = old1 + old2; = 1 + 2; = 3; // Hence the answer
分解x = x++
的第三部分,看它是如何在x = x++ + x++
情况下工作的: –
不知道为什么replace完成为A --> old1
而不是x --> old1
,如x = x++
。
深入了解x = x++
部分,特别是最后一项任务: –
x = oldValue;
如果你认为x++
是A
,那么上面的分配可以分解为以下步骤:
A = oldValue; x = A;
现在,对于目前的问题,它是一样的: –
A = old1; B = old2; x = A + B;
我希望这个清楚。
您正在使用后增量: i = i++;
,这意味着这样的事情:
temp = i; i = i + 1; i = temp;
因为15.14.2后缀增量运算符++ :
后缀增量expression式的值是新值存储之前variables的值。
这就是为什么你有旧的价值。
For循环完成正确:
for (int i = 0; i < 10; i++) { System.err.print("hoo... "); }
因为i = i ++
for (int i = 0; i < 10; i++) { System.err.print("hoo... "); }
我++会报告我的价值,然后增量。 这也意味着你不需要设置我等于i ++,只需改变
for (int i = 0; i < 10; i++) {