Java 对循环迭代不确定?

Java 对循环迭代不确定?,java,for-loop,Java,For Loop,所以我是Java编程新手,我很难理解为什么会这样 for (int i = 0, j=0; i <10; i++) { System.out.println(j += j++); } 打印出0十次 j += j++ 可以被认为是 j = j + j++ 现在,我们从j=0开始,因此j++递增j并返回其原来的值0!,因此,我们基本上只剩下 j = 0 + 0 // ^ ^ // j j++ 十次。j的增加被以下事实所覆盖,即我们将j重新指定给紧随

所以我是Java编程新手,我很难理解为什么会这样

for (int i = 0, j=0; i <10; i++) {
    System.out.println(j += j++);
}
打印出0十次

j += j++
可以被认为是

j = j + j++
现在,我们从j=0开始,因此j++递增j并返回其原来的值0!,因此,我们基本上只剩下

   j = 0 + 0
//     ^   ^
//     j   j++
十次。j的增加被以下事实所覆盖,即我们将j重新指定给紧随其后的右侧0的结果

有时我发现查看字节码很有帮助。j+=j++实际上是:

ILOAD 1    // load j, which is 0
ILOAD 1    // load j, which is 0
IINC 1 1   // j++ 
IADD       // add top two stack elements
ISTORE 1   // store result back in j
由于IINC不会以任何方式改变堆栈,因此IADD将j的值添加到自身:0+0。在IINC增加j后,该结果由晶体管存储回j

可以被认为是

j = j + j++
现在,我们从j=0开始,因此j++递增j并返回其原来的值0!,因此,我们基本上只剩下

   j = 0 + 0
//     ^   ^
//     j   j++
十次。j的增加被以下事实所覆盖,即我们将j重新指定给紧随其后的右侧0的结果

有时我发现查看字节码很有帮助。j+=j++实际上是:

ILOAD 1    // load j, which is 0
ILOAD 1    // load j, which is 0
IINC 1 1   // j++ 
IADD       // add top two stack elements
ISTORE 1   // store result back in j
由于IINC不会以任何方式改变堆栈,因此IADD将j的值添加到自身:0+0。在IINC增加j后,该结果由晶体管存储回j

而不是

System.out.println(j += j++); 
而不是

System.out.println(j += j++); 
在j+=j++中,您实际上正在执行

j = j + j++;
因此,对于j=0,您将得到

j = 0 + j++
由于j++会在返回其值后增加j,所以您将得到

j = 0 + 0;
现在,在j++j等于1之后,但是在计算0+0之后,它将返回到0,并且该值将被打印出来。

在j+=j++中,您实际执行的是

j = j + j++;
因此,对于j=0,您将得到

j = 0 + j++
由于j++会在返回其值后增加j,所以您将得到

j = 0 + 0;

目前,在j++j等于1之后,但在计算0+0之后,它将返回0,并将打印该值。

您不确定for循环吗?int i=0声明一个int i,并将其设置为0。j=0还声明了另一个int j,并将其设置为0。i<10表示当i小于10时,循环将继续进行。最后,i++声明每次循环完成时,i=i+1,因此基本上会向i添加一个。您是否不确定for循环?int i=0声明一个int i,并将其设置为0。j=0还声明了另一个int j,并将其设置为0。i<10表示当i小于10时,循环将继续进行。最后,i++声明,每次循环完成时,i=i+1,因此本质上会向i添加一个循环。

这是一个迭代10次的循环。每次j+=j++的值都是零。继续往下看。你已经得到了一些解释,解释了它为什么会这样做。但是,请不要在真正的代码中这样做。不要把两个改变同一变量的东西放在同一个表达式中。在某些语言中,这类代码的行为可能会在不同的编译器之间发生变化。在Java中,这种行为可能会得到更好的定义,但对于任何试图理解代码的人来说,它仍然是一种折磨。它是一个迭代10次的循环。每次j+=j++的值都是零。继续往下看。你已经得到了一些解释,解释了它为什么会这样做。但是,请不要在真正的代码中这样做。不要把两个改变同一变量的东西放在同一个表达式中。在某些语言中,这类代码的行为可能会在不同的编译器之间发生变化。在Java中,行为的定义可能更好,但对任何试图理解代码的人来说都是一种折磨。这并不能回答问题,它告诉你如何实现OP想要的输出……这并不能回答问题,它告诉你如何实现你认为OP想要的输出……这是java规范定义的好吗?@FDinoff是的,它是完全定义的。这是java规范定义的好吗?@FDinoff是的,它是完全定义的。