我正在做一些关于Java的研究,发现这很令人困惑:
for (int i = 0; i < 10; i = i++) {
System.err.print("hoo... ");
}
这是永无止境的循环!
任何人都有很好的解释为什么会发生这样的事情?
答案 0 :(得分:39)
for (int i = 0; i < 10; i = i++) {
上述循环基本上与: -
相同for (int i = 0; i < 10; i = i) {
for
语句的{ rd 部分 - 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.
现在,由于此处未完成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
和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++
的第3部分,看看它在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;
我希望说清楚。
答案 1 :(得分:8)
你正在使用后增量:i = i++;
,它意味着这样:
temp = i;
i = i + 1;
i = temp;
因为15.14.2 Postfix Increment Operator ++:
后缀增量表达式的值是之前变量的值。
这就是你有旧价值的原因。
完成For-loop:
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
答案 2 :(得分:4)
因为i = i ++
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
答案 3 :(得分:4)
i ++将报告i的值,然后递增。这也意味着您不需要将i设置为等于i ++,只需更改为
for (int i = 0; i < 10; i++) {
答案 4 :(得分:0)
问题出在语句i=i++
中,该语句按顺序执行三个操作。这是i++
中的两个操作和一个Assignment(=
)操作。这些是
i++
先执行两次操作
返回i
增加i
最终分配操作
因此i
在赋值之前递增,使其具有旧值。
让我们在第一个循环(其中i=i++
)中通过三个操作查看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