public static void main(String[] args){
int i = 0;
i = i ++;
System.out.println("i = " + i);
}
我想问的是为什么输出的结果是
i = 0
就算是先执行“i = i”,可是i 的自加不还是要执行的吗?
pause 回复于:2004-10-22 10:04:11
i++ 表达式的值是0.
你把i++的表达式的值赋给了i
那你说i的值是多少呢???
demon-duke 回复于:2004-10-22 10:15:17
这个问题很有意思
你可以去看看编译以后的字节码
看看它是怎么个执行顺序
sakulagi 回复于:2004-10-22 10:22:18
如果用i++和++i的话可以看到编译后的bytecode里iinc和iload的顺序不同。
bysea51 回复于:2004-10-22 16:32:34
十分感谢大家,我用javap看了,不管是i = i++;还是i = ++i;其后都有一个istore_1,是用来赋值的吧,对于i++来说堆栈中的0一直都没改过,所以一执行istore_1,就把i的自加给毁了。
demon-duke 回复于:2004-10-22 17:30:00
javap是什么东东?
ilcj 回复于:2004-10-22 19:35:31
javap是一个Java类分解工具。它能够将一个类分解为一个字节码的描述,在这些描述中告诉了你在没有进行实际的反编译类之前的一个实现是什么样的。和javac不同,javap使用class文件而不是源文件。
天下幽思 回复于:2004-10-24 18:12:17
这个是不是Java本身的BUG。
istore_1是什么意思,出现了两次。
天下幽思 回复于:2004-10-24 18:31:15
我明白了。
i=i++;
i++执行的结果在istrore_1中,(是不是这样,请指教)
由于有关“i ”的操作没有了。所以没有再次iload
就是说变量“i”的内存空间里面没有立即改变。
这么解释的话,JAVA似乎有BUG啊。
镖师甲 回复于:2004-10-24 20:26:30
i++的情况
iconst_0
istore_1
iload_1
iinc 1,1
istore_1
++i的情况
iconst_0
istore_1
iinc 1,1
iload_1
istore_1
镖师甲 回复于:2004-10-24 20:29:51
从上边来看只有iload_1和iinc 1,1是颠倒的.我怎么没体会到为什么i++的时候会输出0.如果istore_1代表存储i,那么不管上边的什么顺序,最后不都是i加一并且被存储了吗.紧接着下边用一个iload_1来去i的值.但是为什么不出现预期的结果呢?
镖师甲 回复于:2004-10-24 20:35:57
除非一种情况,JVM会因为某种原因来调整指令的执行顺序
天下幽思 回复于:2004-10-25 12:57:03
最后不都是i加一并且被存储了吗.
问题是存在那里?
bysea51 回复于:2004-10-25 14:14:32
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
又因为i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 回复 变量 一个 istore_1 执行 师甲 存储 所以 因为 |
注册
个人空间
