后增量运算符未在 for 循环中递增
2022-09-02 02:35:03
我正在对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) {
语句的第 3 部分 - ,计算结果为: -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 的分配,因此不执行第 3 步。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++
想知道为什么替换是作为 而不是 完成的,如 的情况。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;
后缀增量表达式的值是存储新值之前的变量值。
这就是为什么你有旧的价值。
对循环正确完成:
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}