JAVA i++于++i的区别
2024-09-25 20:28:16
大家看一下下面一个程序:
一、问题说明
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)
最新文章
- DIV+CSS 图文混排的图片居中办法
- airline 設定 安裝
- BZOJ1407 [Noi2002]Savage
- css 实现三角形的原理
- C#中不同的线程对控件的更改
- 专题——web.xml 中 url-pattern
- VS2010在C#头文件中添加文件注释的方法
- html5 canvas图片渐变
- 从clone()谈protected
- 关于css的兼容
- NUnit + VS2010 简单入门
- ARC - strong和weak指针
- centos7/redhat7 将网卡名字改成eth样式的方法
- Eclipse中将含有图片资源的项目打包成jar文件
- MyBatis_Generator插件的安装以及简单使用
- 201521123083《Java程序设计》第11周学习总结
- [CVPR 2017] Semantic Autoencoder for Zero-Shot Learning论文笔记
- RSA签名的PSS模式
- 刘志梅2017710101152.《面向对象程序设计(java)》第十一周学习总结
- 洛谷P4242 树上的毒瘤
热门文章
- cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法
- source insight设置tab键为4个空格
- Java从网络批量读取图片并保存至本网站服务器后再插入文章中
- android自己定义换行居中CenterTextView
- 阿里NLP总监分享-NLP技术的应用与思考
- sharepoint 2010 记录管理 对象模型
- HTML中的转义字符 (转)
- 领扣-1/167 两数之和 Two Sum MD
- Linux杀毒软件ClamAV初次体验
- 最小公倍数 SRM 661 Div1 250: MissingLCM