我正在做一些关于 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) {
您陈述的第三部分- ,被评估为: -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 = 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++
,我们需要执行我们在评估A
and时留下的最后一个赋值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
分配给i
i
( i= 0 + 1 = 1
)0
, i
( i = 0
),最终i
获得其旧值。i++
首先返回,但在i
任何操作完成之前它会立即递增(i
变为i+1
),但是我们还需要完成赋值操作,以便将返回的值赋值为i
使其具有旧值,从而进入无限循环。
所以替换i=i++
为i++
或i=i+1