Java 增量后运算符在for循环中不递增

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

我正在做一些关于Java的研究,发现这非常令人困惑:

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++) {