public class a1{
public static void main(String[] args){
int x=0;
x=x++;
System.out.println("x="+x);
}
}为什么输出结果为0,而不为1 ???
public static void main(String[] args){
int x=0;
x=x++;
System.out.println("x="+x);
}
}为什么输出结果为0,而不为1 ???
也就是说这个CPU里面的存储器是stack结构的,特点是好像一个大坑,先掉进去的最后才能爬出来。
那么我们看一下你的反汇编代码。int i = 0;
i++;
这个反编译出来的是:
0:iconst_0将常数0推入stack
1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
2:iinc1, 1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1
5:return返回int i = 0;
i = i + 1;
反编译的结果是:
0:iconst_0将常数0推入stack
1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值: 0
3:iconst_1将变量1推入stack,现在stack里面有两个值,依次(推入次序)为: 0, 1
4:iadd从stack中弹出两个值进行相加,并将结果推入stack,现在stack里面又剩下一个值: 1 (因为0 + 1 = 1)
5:istore_1从stack中弹出一个值(这个值显然是刚刚算出的1)存储到变量索引为1的位置(也就是我们的i),现在i变成了1
6:return返回int i = 0;
i = i ++;
反编译的结果是: 0:iconst_0将常数0推入stack
1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值: 0
3:iinc1, 1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1
6:istore_1从stack中弹出一个值(这个值应该是前面2的位置推入的0)存储到变量索引为1的位置(也就是我们的i),现在i又变成了0
7:return返回
x=x++;等价于int x = 0;
int y = x; // 先返回
x = x + 1; // 后加加
x = y; // 最后把返回值附给x
x=x++;等价于int x = 0;
int y = x; // 先返回
x = x + 1; // 后加加
x = y; // 最后把返回值附给x
为什么不是:
x=x;
x++;
i = i ++;
反编译的结果是: 0:iconst_0将常数0推入stack
1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)
2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值: 0
3:iinc1, 1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1
6:istore_1从stack中弹出一个值(这个值应该是前面2的位置推入的0)存储到变量索引为1的位置(也就是我们的i),现在i又变成了0
7:return返回
就看这一部分就行了
请问这个表达式:x++的返回结果是什么?
public class a1{
public static void main(String[] args){
int x=0;
System.out.println("x="+(x++));
}
}
同意亡灵,涉及JAVA寄存器的原理
JAVA群,欢迎大家加入讨论!QQ群8595489
x++作为一个表达式最后的值就是x,在函数里就是0。然后执行x=0,最后x自然为0。