Java中j + = j ++做了什么?

Zet*_*tor 4 java

任何人都可以向我解释这种行为吗?
首先,我认为答案是511 + 512(如果j + = j ++意味着j = j +(j + 1))
我怎样才能证明答案为零?

public class Test
{
    public static void main(String[] args)
    {
        int i = 0;
        int j = 0;
        for (i = 0, j = 0; i < 10; i++) 
        {
            j += j++;
            System.out.println("i = " + i +  " >> " + j);
        }
        System.out.println(j);
    }
}

> java Test
i = 0 >> 0
i = 1 >> 0
i = 2 >> 0
i = 3 >> 0
i = 4 >> 0
i = 5 >> 0
i = 6 >> 0
i = 7 >> 0
i = 8 >> 0
i = 9 >> 0
0
Run Code Online (Sandbox Code Playgroud)

Krz*_*cki 6

因为,j++是指评价后增量,j+=x意味着j=j+x所以j变得j+1评估后j=j+j它是一个零这个另外的计算,j被用j递增++后(相加结果0),但是在此之后的相加结果重写递增Ĵ值按其值0.

看看这个,假设j = 0;

j += j++
Run Code Online (Sandbox Code Playgroud)

j++增量将阅读后执行j价值,这是0现在.

所以它转化为:

   1) read the first value for add operation - the value of j is 0 so we have add(0, ?)
   2) read the second value for add operation `j++` is first evaluated to 0
      so we have now add(0,0), 
      then j is incremented by 1, but it has this value for a very short time:
   3) execute the add(0,0) operation, the result is 0 and overrides the incrementation done in previous setep.
   4) finally the j is 0
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,j在很短的时间内变为1,但在此之后很快被覆盖.

结论是数学j += j++;最终变得唯一j = j + j;

在你的for循环中,这种情况会重复每一次循环执行,最初j为0,所以它永远保持这样,在每次循环运行中闪烁一次很短的时间.

也许你可以使j挥发,然后在评估期间由其他线程在循环中读取它j += j++;.阅读线程可能会看到j暂时变为1,但这是不确定的,在我的情况下,我发现使用这个简单的测试程序发生了这种情况:

public class IncrementationTest {

    public static void main(String[] args) {
        new IncrementationTest().start();
    }

    private volatile int j;

    private void start() {
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    System.out.println(j);
                }
            }
        }.start();

        while (true) {
            j += j++;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

输出是:

...
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
...
Run Code Online (Sandbox Code Playgroud)

在我的机器上,似乎经常开心地阅读中间版1进行评估 j += j++


Ori*_*ntz 4

因为当您这样做时,a = b + c您首先读取b然后c计算值。

另外,j++means 返回 j 的当前值,然后将其加一。

在您的情况下,既然您j = j + j++首先读取j,然后再次读取j并返回 的值j。让我们以第一次迭代为例:

  1. 你读到 j = 0
  2. 你再次读取 j = 0
  3. 你计算一下j = j + 1
  4. 但是,现在您计算j = 0 + 0并覆盖该值

所以到迭代结束时,j的值没有改变。它仍然是 0。每次迭代都是如此,这就是为什么 的值j永远不会改变的原因。