我正在做一些关于 Java 的研究,发现这很令人困惑:
for (int i = 0; i < 10; i = i++) {
  System.err.print("hoo... ");
}
这是永无止境的循环!
任何人都有很好的解释为什么会发生这种情况?
我正在做一些关于 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) {
您陈述的第三部分- ,被评估为: -fori = 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 = x++ + x++;
R    A     B
现在,首先将评估 RHS 部分(A + B),然后将最终结果分配给x. 所以,让我们继续前进。
首先A评估:-
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.
现在,由于这里没有完成 to 的分配,A所以R不执行第 3 步。
现在,进行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++,我们需要执行我们在评估Aand时留下的最后一个赋值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++: -想知道为什么替换是 asA --> old1而不是x --> old1,如x = x++.
深入了解x = x++部分,特别是最后一个作业:-
x = oldValue;
如果您考虑x++到A这里,那么上述作业可以分为以下步骤:-
A = oldValue;
x = A;
现在,对于当前的问题,它与以下内容相同:-
A = old1;
B = old2;
x = A + B;
我希望这能说清楚。
您正在使用 post-increment: i = i++;,它的意思是这样的:
temp = i;
i = i + 1;
i = temp;
后缀增量表达式的值是存储新值之前变量的值。
这就是为什么你有旧的价值。
正确的 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++ 将报告 i 的值,然后递增。这也意味着您不需要将 i 设置为等于 i++,只需更改为
for (int i = 0; i < 10; i++) {
问题出在语句中i=i++,这个语句依次做了三个操作来完成。这是两个操作i++和一个 assignment( =) 操作。这些都是;
i++在任何操作之前进行两次操作
退货i 
增量i
最后赋值操作
所以i在赋值之前递增,使其具有旧值。
让我们看看i=i++第一个循环( where i = 0)的三个操作
0分配给ii( i= 0 + 1 = 1)0, i( i = 0),最终i获得其旧值。i++首先返回,但在i任何操作完成之前它会立即递增(i变为i+1),但是我们还需要完成赋值操作,以便将返回的值赋值为i使其具有旧值,从而进入无限循环。
所以替换i=i++为i++或i=i+1