任何人都可以向我解释这种行为吗?
首先,我认为答案是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)
因为,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++
因为当您这样做时,a = b + c您首先读取b然后c计算值。
另外,j++means 返回 j 的当前值,然后将其加一。
在您的情况下,既然您j = j + j++首先读取j,然后再次读取j并返回 的值j。让我们以第一次迭代为例:
j = j + 1j = 0 + 0并覆盖该值所以到迭代结束时,j的值没有改变。它仍然是 0。每次迭代都是如此,这就是为什么 的值j永远不会改变的原因。
| 归档时间: |
|
| 查看次数: |
9674 次 |
| 最近记录: |