i++ 和 ++i的字节码指令
代码
public class Test{
public static void main(String args[]){
int i=0;
i=i++;
System.out.println(i);
}
}
输出 0 , 说实话我第一看也打错了,看看字节码
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_1
7: getstatic #2 // Field java/lang/System.out:Ljava/
io/PrintStream;
10: iload_1
11: invokevirtual #3 // Method java/io/PrintStream.printl
n:(I)V
14: return
}
指令3 iinc 1,1 直接+1到第二个变量i 中,这时候i=1;
再执行istore_1 把操作数栈写回到变量i, 这时候i又变成0
我们把代码改改
public class Test{
public static void main(String args[]){
int i=0;
//i=i++;
i=i+1;
System.out.println(i);
}
}
字节码指令
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: istore_1
6: getstatic #2 // Field java/lang/System.out:Ljava/
io/PrintStream;
9: iload_1
10: invokevirtual #3 // Method java/io/PrintStream.printl
n:(I)V
13: return
}
i=i+1 执行的是iadd指令,这是操作数栈里的字节码指令,把新值1压入到操作数栈,再执行istore_1 把操作数栈回写到变量i, 于是i变成了1
最新文章
- GCC 预处理、编译、汇编、链接..
- iOS之关于 srand() 和rand()
- Java设计模式(三)——观察者模式和监听器
- 给 VS 2010 选一个好用的代码行数统计器(转)
- 如何给澳洲路局写信refound罚金,遇到交通罚款怎么办
- notepad++ 各类插件学习记录
- php保存远程文件到本地的方法
- 【转】使用cocos2d-console工具转换脚本为字节码
- 学长们的求职血泪史(C/C++/JAVA)
- Selenium webdriver 查找元素
- 在 Windows 下远程桌面连接 Linux - VNC 篇
- MongoDB shell操作
- Elasticsearch【正则搜索】分析&;实践
- 计蒜客NOIP模拟赛(2) D2T3 银河战舰
- ctx中的body无法找到
- 汇编语言--微机CPU的指令系统(五)(条件设置字节指令)
- 【LGP5176】公约数
- python之WSGI与Guincorn
- left outer join的on不起作用
- 十一、持久层框架(MyBatis)