博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
i++ 和 ++i的字节码指令
阅读量:4334 次
发布时间:2019-06-07

本文共 1270 字,大约阅读时间需要 4 分钟。

代码

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

 

转载于:https://www.cnblogs.com/devilwind/p/8643415.html

你可能感兴趣的文章
[ASP.NET] Session的了解
查看>>
Android书籍推荐
查看>>
笔记68 Redis数据库
查看>>
java判断一个类是否公共类
查看>>
LeetCode_Letter Combinations of a Phone Number
查看>>
四、jquery中的事件与应用
查看>>
Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件
查看>>
Javaweb权限管理设计思路
查看>>
测试实例
查看>>
mysql中文乱码的一点理解
查看>>
XXL-Job分布式任务调度
查看>>
ASP隐藏文件地址,并在下载时替换文件名
查看>>
Windows下MongoDB的安装与设置MongoDB服务
查看>>
Microsoft.Jet.OLEDB.4.0”提供程序不支持 ITransactionLocal 接口。本地事务不可用于当前提供程序...
查看>>
oc 代码块的使用
查看>>
转:Eclipse中打开文件所在文件夹的插件及设置
查看>>
Django 之Form
查看>>
苹果产品时间发布表统计(iPhone、iPad),以及32位和64位机的说明
查看>>
cocos2dx中的用户数据的管理
查看>>
微信公众平台开发教程(九)微信公众平台通用开发框架
查看>>