Java开发网 |
注册 |
登录 |
帮助 |
搜索 |
排行榜 |
发帖统计
|
您没有登录 |
» Java开发网 » Java SE 综合讨论区
打印话题 寄给朋友 订阅主题 |
作者 | [原创]Java中的++运算符 |
jimshen
发贴: 18 积分: 2 |
于 2006-08-09 10:33
在Java中下面的两个程序的运行后i的值是不一样的,这一点和C或者C++有所不同,关键在于Java虚拟机的实现及其指令的特点。(Java语言规范中的Java虚拟机规范) 1. public class Inc{ public static void main(String argv[]){ int i=0; i=i++; } } 运行之后i=0。奇怪?为什么呢? 对程序进行反汇编(注意不是反编译,如果是反编译得到的是Java代码不是Java汇编代码) $0 iconst_0 //push 'int' constant 0 $1 istore_1 //store 'int' into local variable #1 $2 iload_1 //load 'int' from local variable #1 $3 iinc *1 1 //increment local variable by constant $6 istore_1 //store 'int' into local variable #1 $7 return //return 'void' from method 下面解释其中的Java汇编指令的含义: $0 iconst_0 iconst_<i> 作用是将常数i压入操作数栈,这里是0 $1 istore_1 istore_<n> n是指当前局部变量帧中局部变量的索引,这里的1说明是第一个变量(我们的程序中只有一个变量,当然是第一个),指令从操作数栈顶弹出一个整型数放到指定的变量中,因此局部变量i的值被赋值为0。由此看到,这个和我们在8086汇编语言中看到的很不一样,在80x86中用MOV指令就可以了 $2 iload_1 iload_<n> n是指当前局部变量帧中局部变量的索引,这里的1说明是第一个变量;指令把从变量取出的值压入操作数栈 $3 iinc *1 1 iinc index const 该指令中index是指当前局部变量帧中局部变量的索引,const是说明在这个变量上加多少,在这条指令中将i加1。这条指令不影响操作数栈。 $6 istore_1 关键在于这儿,该指令又从操作数栈顶弹出一个整型数放到指定的变量中;刚才第三条指令已经将0压入堆栈,所以弹出后赋值给i,结果i的值还是保持0不变。 $7 return 方法返回,这个就不多说了 2. public class Inc{ public static void main(String argv[]){ int i=0; i=++i; } } 运行之后i=1 程序反汇编的结果 $0 iconst_0 //push 'int' constant 0 //将0压入操作数栈 $1 istore_1 //store 'int' into local variable #1 //从操作数栈顶弹出0存放在第一个变量i中 $2 iinc *1 1 //increment local variable by constant //i的值加1,所以i=1 $5 iload_1 //load 'int' from local variable #1 //将第一个变量i的值压入操作数栈 $6 istore_1 //store 'int' into local variable #1 //从操作数栈顶弹出值到i,所以i=1 $7 return //return 'void' from method //返回 基于WEB的J2EE报表解决方案集锦 |
话题树型展开 |
人气 | 标题 | 作者 | 字数 | 发贴时间 |
6587 | [原创]Java中的++运算符 | jimshen | 1590 | 2006-08-09 10:33 |
已读帖子 新的帖子 被删除的帖子 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |