有人能向我解释一下这种行为吗?
首先,我认为答案是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发布于 2015-06-17 10:08:31
因为当您执行a = b + c时,首先读取b和c,然后计算值。
另外,j++意味着返回j的当前值,然后将其递增1。
在您的示例中,由于您执行了j = j + j++,所以首先读取j,然后再次读取j并返回j的值。让我们用第一次迭代来做一个例子:
j = j + 1j = 0 + 0并重写该值。因此,到迭代结束时,j的值没有变化,仍然是0,这是为什么j的值永远不变的原因。
发布于 2015-06-17 10:06:47
因为,j++,表示求值后的增量,而j+=x则表示求值为0 (加法结果为0)后的j变为j+1,所以j由j++递增,但在此之后,加法结果以0的值覆盖递增的j值。
看看这个,让我们假设j=0;
j += j++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因此,在这种情况下,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++;
}
}
}产出如下:
...
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。
发布于 2015-06-17 10:09:44
出现此问题是因为“j++”(如果在语句中使用的话)以下列格式工作-
j的值j值。在你的情况下,当你做j += j++时发生的事情是-
j的值在语句中使用,在语句中使用,因此j++返回要在语句中使用的0,我们计算了要分配给j的0 + 0 (尚未分配)。j的增量值被分配给j,即j现在变成1。j,因此j再次成为0。https://stackoverflow.com/questions/30888331
复制相似问题