首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >J += j++在Java中做什么?

J += j++在Java中做什么?
EN

Stack Overflow用户
提问于 2015-06-17 10:01:45
回答 6查看 17.5K关注 0票数 5

有人能向我解释一下这种行为吗?

首先,我认为答案是511 + 512 (如果j += j++意味着j=j+ (j+1))

我怎样才能证明答案为零呢?

代码语言:javascript
复制
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
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-06-17 10:08:31

因为当您执行a = b + c时,首先读取bc,然后计算值。

另外,j++意味着返回j的当前值,然后将其递增1。

在您的示例中,由于您执行了j = j + j++,所以首先读取j,然后再次读取j并返回j的值。让我们用第一次迭代来做一个例子:

  1. 你读j=0
  2. 你又读了j=0
  3. 计算j = j + 1
  4. 但是,现在计算j = 0 + 0并重写该值。

因此,到迭代结束时,j的值没有变化,仍然是0,这是为什么j的值永远不变的原因。

票数 4
EN

Stack Overflow用户

发布于 2015-06-17 10:06:47

因为,j++,表示求值后的增量,而j+=x则表示求值为0 (加法结果为0)后的j变为j+1,所以j由j++递增,但在此之后,加法结果以0的值覆盖递增的j值。

看看这个,让我们假设j=0;

代码语言:javascript
复制
j += j++

j++增量将在读取j值之后执行,该值目前为0

因此,它转化为:

代码语言:javascript
复制
   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

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

得出的结论是,数学上的j += j++;最终变成了j = j + j;

在for循环中,这种情况重复每一个循环的执行,最初的j值是0,所以在每个循环运行过程中,都会保持这样的状态,只需很短的时间就会闪烁到一个循环。

也许您可以使j值不稳定,然后在计算此j += j++;时由其他线程在循环中读取它。读取线程可能会在一段时间内看到j变成1,但这是不确定的,在我的例子中,我看到这种情况是通过这个简单的测试程序发生的:

代码语言:javascript
复制
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++;
        }

    }

}

产出如下:

代码语言:javascript
复制
...
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
...

在我的机器上,似乎经常有机会读到用于评估j += j++的中间1。

票数 6
EN

Stack Overflow用户

发布于 2015-06-17 10:09:44

出现此问题是因为“j++”(如果在语句中使用的话)以下列格式工作-

  1. 首先,在语句中使用j的值
  2. 然后增加j值。

在你的情况下,当你做j += j++时发生的事情是-

  1. 首先,j的值在语句中使用,在语句中使用,因此j++返回要在语句中使用的0,我们计算了要分配给j0 + 0 (尚未分配)。
  2. j的增量值被分配给j,即j现在变成1
  3. 从步骤1中计算出来的值(为0)被赋值给j,因此j再次成为0
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30888331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档