Java 增量后运算符在for循环中不递增
我正在做一些关于Java的研究,发现这非常令人困惑:Java 增量后运算符在for循环中不递增,java,loops,for-loop,infinite-loop,post-increment,Java,Loops,For Loop,Infinite Loop,Post Increment,我正在做一些关于Java的研究,发现这非常令人困惑: for (int i = 0; i < 10; i = i++) { System.err.print("hoo... "); } for(int i=0;i
for (int i = 0; i < 10; i = i++) {
System.err.print("hoo... ");
}
for(int i=0;i<10;i=i++){
系统错误打印(“呼…”);
}
这是永无止境的循环
有人能很好地解释为什么会发生这种事情吗?您使用的是后增量:
i=i++代码>,它的意思如下:
temp = i;
i = i + 1;
i = temp;
因为:
后缀增量表达式的值是存储新值之前变量的值
这就是为什么你有旧的价值观
对于正确完成的循环:
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
for(int i=0;i<10;i++){
系统错误打印(“呼…”);
}
您需要从此处删除分配,以使其正常工作:-
for (int i = 0; i < 10; i++) {
获得的数据如下:-
让我们标记第二个语句的不同部分:-
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+++x++
情况下的工作原理:-
想知道为什么替换是按A-->old1
进行的,而不是像x=x++
那样按x-->old1
进行的
深入查看x=x++
部分,特别是最后一项作业:-
x = oldValue;
如果你认为<代码> x++ >代码>这里是代码> < <代码> >,那么上面的任务可以被分解成以下步骤:-
A = oldValue;
x = A;
现在,对于当前的问题,它与:-
for (int i = 0; i < 10; i = i) {
A = old1;
B = old2;
x = A + B;
我希望这能说明问题。因为I=I++
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
for(int i=0;i<10;i++){
系统错误打印(“呼…”);
}
i++将报告i的值,然后递增。这也意味着您不需要将i设置为等于i++,只需更改为
for (int i = 0; i < 10; i++) {
for(int i=0;i<10;i++){
问题在于语句i=i++
,此语句按顺序执行三个操作来完成。这是i++
中的两个操作和一个赋值(=
)操作。它们是:
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
这是解释i=i++
和普通i++
之间区别的唯一答案。好吧,这看起来是可能的,但我在某处找到了int x=1;x=x++
的例子,在那之后x
仍然是1
,但在这里:ode>x=x+++x++
x将不再是1
或2
,而是3
-如何?我对此感到好奇并用谷歌搜索,解释了i=i++
在@emka86不起作用的原因。可能是x++
的计算结果为1
,但x++/code>的计算结果为3
。但这仍然是非常重要的eresting。我会详细看一看。@emka86。这确实值得一个新问题的位置。你应该问它。这x=x+++x++;
1。现在,我正在尝试设置评估顺序。
A = oldValue;
x = A;
A = old1;
B = old2;
x = A + B;
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
for (int i = 0; i < 10; i++) {