JAVA i++于++i的区别
大家看一下下面一个程序:
一、问题说明
Test.java
public class Test {
public static void main(String[] args) {
int i = 1;
i = ++i;
System.out.println(i);
}
}
输出:2,这应该没有异议对吧,那么再看一个程序
Test1.java
public class Test1 {
public static void main(String[] args) {
int i = 1;
i = i++;
System.out.println(i);
}
}
输出:1。有点意思了吧~
问题解答
其实这是因为java解析器在生成class文件的不一致造成的。
使用javap -verbose Test 查看内容(代码片段):
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: iconst_1 //将1推送到栈顶
1: istore_1 //将栈顶的内容赋值给第二个变量i,注意此时栈顶的内容是:1
2: iinc 1, 1 //执行加一操作
5: iload_1 //将变量i的内容推送到栈顶
6: istore_1 //将栈顶的内容保存到变量i
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
使用 javap -verbose Test1查看内容(代码片段):
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: iconst_1
1: istore_1
2: iload_1 //将变量i的内容推送到栈顶,不知道为什么这么生成字节码!注意此时栈顶的内容是:1
3: iinc 1, 1 //执行加一操作
6: istore_1 //将栈顶的内容保存到变量i
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
发现少了一个iload_1,意思是将变量推送至栈顶,结果i=i++;命令虽然执行了加i+1的操作但是没有保存回到变量i中。
命令说明:
- iconst_1 将int型1推送至栈顶
- istore_1 将栈顶int型数值存入第二个本地变量
- iload_1 将第二个int型本地变量推送至栈顶(正是因为少了这个操作,才出现以上问题)
- iinc 将指定int型变量增加指定值(i++, i--, i+=2)
JAVA i++于++i的区别的更多相关文章
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
- JDK与Java SE/EE/ME的区别
1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用 ...
- java 静态方法和实例方法的区别
转自 java 静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法 ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- java抽象类与接口的区别及用法
java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...
- 【转】java int与integer的区别
java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1 ...
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- java中a++与++a区别
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
随机推荐
- Swift - 添加纯净的Alamofire
Swift - 添加纯净的Alamofire 如果你有代码洁癖,不能容忍任何多余的东西,请继续往下看. . 下载Alamofire (https://github.com/Alamofire/Ala ...
- tsung执行时报Can't locate Template.pm的解决
[root@openfire-x86v-app01 20141118-0931]# tsung_stats creating subdirectory data creating subdirecto ...
- 权力的游戏第一季/全集Game of Thrones迅雷下载
<权力的游戏>是一部中世纪史诗奇幻题材的电视连续剧,该剧以美国作家乔治·R·R·马丁的奇幻巨作<冰与火之歌>七部曲为基础改编创作. 故事背景中虚构的世界,分为两片大陆:位于西面 ...
- Linux Shell 裡一些很少用到卻很有用的指令
Linux Shell 裡一些很少用到卻很有用的指令 2009年11月30日 13:53:00 yaoyasong 阅读数:414 Linux Shell 裡一些很少用到卻很有用的指令 你是不是已 ...
- Gradle 简介
一.简介 Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle 确实比较慢,这和 ...
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)
HttpServletRequest获取请求头信息 (1)获取客户机请求头 String getHeader(String name) Enumeration<String> getHe ...
- webpack打包器简单入门
概念 webpack是一个现代javascript应用程序的模块打包器. 当webpack处理你的应用程序时,它会递归构建一个依赖图(包含了你的应用程序所需要每个模块),然后把这些模块打包到少数几个b ...
- Commands to help you to Start Using ScaleIO Storage
To start using your storage: Log in to the MDM: scli --login --username admin --password <passwor ...
- 一款基于jQuery的图片场景标注提示弹窗特效
今天给大家分享一款基于jQuery的图片场景标注提示弹窗特效,这款实例适合在图片上标注某个物件,单击弹出详情说明,兼容360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之 ...
- 浅析 @PathVariable 和 @RequestParam
一.代码实例 首先,上两个地址: 地址1:http://localhost:8989/SSSP/emps?pageNo=2 地址2:http://localhost:8989/SSSP/emp/7 如 ...