我和i = i ++ in for loop java

viv*_*tty 4 java for-loop

这种行为背后的逻辑是什么?

 int i=0;
    for(int k=0;k<10;k++){
    i++;
    }
    System.out.println("i="+i);

Output=10; //Exepcted



 int i=0;
    for(int k=0;k<10;k++){
    i=i++;
    }
    System.out.println("i="+i);

Output=0; //Surprised :) 
Run Code Online (Sandbox Code Playgroud)

任何人都可以对上述功能有所了解吗?

Mar*_*oun 8

看到这个精彩的答案:

x = x++;
Run Code Online (Sandbox Code Playgroud)

相当于

int tmp = x;
x++;
x = tmp;
Run Code Online (Sandbox Code Playgroud)

这个问题.

  • 任何试图理解“x=x++”的人请记住,后增量优先于赋值和 x++ 增量,但返回旧值。 (3认同)

Mic*_*rry 6

i = i++是一个后缀增量运算符 - 它递增i,然后将其返回到其原始值(因为它i++基本上"返回" i它增加之前的值.)

i = ++i会工作,因为它是一个前缀增量运算符,并会在增量后返回I的值.但是,您可能只想i++在没有任何额外任务的情况下执行此操作,就像您在第一次运行中所做的那样 - 它(基本上)就像它的速度一样i = i+1.


The*_*ian 5

之所以发生这种情况,是因为 java 是按值传递的。

在第一个循环中,在语句i中递增i++,但是,在第二个循环中,发生的情况是i指向存储值(在本例中为 0)的i内存位置,然后递增旧位置。

可视化:

i => 0x00000001 // 0

for() {
    i => 0x00000002 <- 0  // store old i value (0) in new location
    0x00000001++          // Increment the value stored at the old location

    // Cause there is no longer a reference to 0x00000001, 
    // it will get garbage collected and you will be left with
    // i => 0x00000002
Run Code Online (Sandbox Code Playgroud)

它将继续这样做,将旧值分配给新位置并为循环的每次传递增加旧值