Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java SE 综合讨论区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 [原创]Java中的++运算符
jimshen





发贴: 18
积分: 2
于 2006-08-09 10:33 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在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
//返回




flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   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