关于i=i++在c语言和java语言中的差异原因分析
2015-01-12 20:46
246 查看
int i = 0; i=i++;
在c语言和java中上述两句话的运行结果是不同的,那么到底是为什么呢?
这原因可能能从大量的语法规范中获得最终的解答,但是能不能更直接地得出原因呢?
答案是肯定的,其实造成这种原因的根本就是我们并没有完全确定i=i++这句话的执行真实的情况.
好了,下面通过反汇编给出解答.
首先,在c语言中这两句话反汇编的结果如下:
mov dword ptr [ebp-4],0 ;这句话即为int i = 0 mov eax,dword ptr [ebp-4] ;将i的值给寄存器eax mov dword ptr [ebp-4],eax ;将寄存器的值给i mov ecx,dword ptr [ebp-4] ;将i的值给寄存器ecx add ecx,1 ;将寄存器ecx的值加1 mov dword ptr [ebp-4],ecx ;将ecx的值给ax
有汇编基础的可以很容易得到答案. i最终的值是1.
下面是java中这两句话的反汇编结果:
iconst_0 ;0入栈 istore_1 ;将栈顶int类型值保存到局部变量1中,至此完成int i = 0 iload_1 ;将局部变量1的int类型值入栈 iinc 1,1 ;局部变量1加1,此时i变为1 istore_1 ;将栈顶int类型值保存到局部变量1中,此时i又变回了0从上面的注释中大家可以很容易看出将i自增是在赋值语句之前的,所以i=i++;这句话的实际执行流程是先将i的值压入栈,在将i的值增加1,最后把刚才压入栈的值弹出保存到i中.
最后谈一点:java的指令流是一种基于栈的指令集架构,指令流中的大部分都是零地址指令,依赖于操作数栈进行工作.与之相对的另一套常用的架构是基于寄存器的指令集,最典型的就是我们熟悉的x86指令集.
相关文章推荐
- 关于vb.net和c#,c#和java语言的语法差异对比
- 关于java.lang.NoSuchMethodError的分析,产生的原因及处理方式
- 关于A+B+C问题4种语言的解决办法,Java、C语言、C++、Python
- Java(其实是计算机系统的通病,而不单单是Java的问题,C、C++等任何语言都有这个问题)关于小数的运算结果,不正确不精确,原因剖析,及解决办法
- 关于在Java中链接SQLServer数据库中失败的原因分析
- 关于java中文件删除失败的原因分析
- 关于两代语言.C/C++,java/c#_C#教程
- 关于两代语言.C/C++,java/c#_C#教程
- Struts常见错误及原因分析-Java基础-Java-编程开发
- 面向对象思想 - 关于对象(材料来自thinking in Java,这些东西是跟C#相通的,跟语言无关)
- 关于两代语言.C/C++,java/c#
- 关于Java编程的中文问题的几条分析原则
- 因近日安装java设置环境变量无果,转载以前发的帖子-----关于C语言
- [全程建模]关于分包的问题——用例、分析模型、设计模型的分包的作用和差异的对话
- Java vs C# —— 关于两代语言.C/C++,java/c#
- C++与C语言细节差异分析
- WCDMA缩略语 & 几个容易混淆的概念 & 关于掉话原因分析
- 微软公司的C#语言可能是Java的灭亡的原因,但Sun公司的ONE则应受到批评
- 分析 java.sql.SQLException: 类型长度大于最大值 原因
- 关于Java中文问题的几条分析原则