`
yydy1983
  • 浏览: 47693 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

++问题

阅读更多
 i = i++;在c++和java下的不同结果。

int i = 0;

i = i++;
c++下结果是1,
4:        int i=0;
00401058   mov         dword ptr [ebp-4],0
5:        i=i++;
0040105F   mov         eax,dword ptr [ebp-4]
00401062   mov         dword ptr [ebp-4],eax
00401065   mov         ecx,dword ptr [ebp-4]
00401068   add         ecx,1
0040106B   mov         dword ptr [ebp-4],ecx
c++是面向过程的语言,++运算符的意义是执行完当前语句之后,将目标值加1
java和C#下结果却是0,
JVM   模拟一个基于stack(堆栈)的   CPU。  
  也就是说这个CPU里面的存储器是stack结构的,特点是好像一个大坑,先掉进去的最后才能爬出来。  
  那么我们看一下你的反汇编代码。  
   
  int   i   =   0;  
  i++;  
  这个反编译出来的是:  
        0:iconst_0将常数0推入stack  
        1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)  
        2:iinc1,   1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1  
        5:return返回  
   
  int   i   =   0;  
  i   =   i   +   1;  
  反编译的结果是:  
        0:iconst_0将常数0推入stack  
        1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)  
        2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值:   0  
        3:iconst_1将变量1推入stack,现在stack里面有两个值,依次(推入次序)为:   0,   1  
        4:iadd从stack中弹出两个值进行相加,并将结果推入stack,现在stack里面又剩下一个值:   1   (因为0   +   1   =   1)  
        5:istore_1从stack中弹出一个值(这个值显然是刚刚算出的1)存储到变量索引为1的位置(也就是我们的i),现在i变成了1  
        6:return返回  
   
  int   i   =   0;  
  i   =   i   ++;  
  反编译的结果是:  
   
        0:iconst_0将常数0推入stack  
        1:istore_1从stack中弹出一个值(这个值显然是刚刚推入的0)存储到变量索引为1的位置(也就是我们的i)  
        2:iload_1将变量索引为1的变量值推入stack,现在stack里面只有一个值:   0  
        3:iinc1,   1将变量索引为1的变量(也就是我们的i)值增加1,现在i变成了1  
        6:istore_1从stack中弹出一个值(这个值应该是前面2的位置推入的0)存储到变量索引为1的位置(也就是我们的i),现在i又变成了0  
        7:return返回
java是纯面向对象的。所有运算符都回被当作函数来对待。java中的++运算符和c++中重载++运算符很相似
分享到:
评论

相关推荐

    libstdc++.so.6.0.20

    7. **故障排查**:当应用程序因libstdc++问题而崩溃或无法运行时,可以尝试更新库,或者使用`ldd`、`objdump`等工具检查依赖关系。在某些情况下,可能需要静态链接库避免运行时依赖问题,但这会使可执行文件体积增大...

    Notepad++v7.3.3

    1.修复CIA Hacking Notepad ++问题(https://wikileaks.org/ciav7p1/cms/page_26968090.html)。 2.将鼠标滚轮固定到任务列表滚动崩溃错误。 3.解决修改或从外部删除文档后切换回来闪烁问题。 4.支持摩托罗拉S-...

    i++问题探讨的与解答

    i++的描述,挺好的资源,做了比较经典的分析,大家共享

    Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例

    Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例Vue技术七大问题避坑指南+编程技术开发+编程问题+编程案例Vue技术七大问题避坑指南+编程技术开发+...

    PointNet++总结

    5. PointNet++问题: PointNet++模型也存在一些问题: * 没有考虑到局部特征的融合 * 没有考虑到点云数据之间的关系 * 需要大量的计算资源和时间 6. PointNet++改进方向: PointNet++模型可以通过以下方法进行...

    解决ubuntu找不到libstdc++.so.5问题

    解决ubuntu找不到libstdc++.so.5问题: 一般是你的gcc版本比较高,自从gcc出3.4版本后,就不用libstdc++.so.5,改用libstdc++.so.6了。 如果sudo apt-get install libstdc++5 未果,说找不到这个包,就下载该资源...

    spy++ 绿色工具

    这个绿色工具被封装在名为"spy++.zip"的压缩包中,无需安装即可直接使用,为开发者提供了一个便捷的环境来检测和解决程序UI的显示问题。 Spy++ 的主要功能包括: 1. **窗口查找与监控**:它可以查找并显示系统中的...

    lstdc++ 库

    - **使用兼容性层**:有一些第三方工具如`cxxabi`可以创建一个兼容层,使得使用`lstdc++`编译的库能在libc++环境中运行,但这可能会带来额外的复杂性和潜在的问题。 - **回退Xcode版本**:如果项目对旧版本库有...

    OpenMVS注释+重建结果+运行常见问题+相关理论+传统多视图三维重建 MVS论文 集合(稠密重建、曲面重建、网格优化、纹理贴

    OpenMVS注释+重建结果+运行常见问题+相关理论+传统多视图三维重建 MVS论文 集合(稠密重建、曲面重建、网格优化、纹理贴图、综述) OpenMVS注释+重建结果+运行常见问题+相关理论+传统多视图三维重建 MVS论文 集合...

    allegro odb++插件

    3. 验证与检查:插件提供了一套验证工具,用于检查导入的ODB++数据是否完整、准确,是否存在潜在的制造问题。例如,它可以检查层设置、焊盘和走线的尺寸,确保它们符合制造规范。 4. 层级管理和映射:插件支持...

    美赛真题解析:资源的可利用性与性别比例问题+编程知识+技术开发

    美赛真题解析:资源的可利用性与性别比例问题+编程知识+技术开发; 美赛真题解析:资源的可利用性与性别比例问题+编程知识+技术开发; 美赛真题解析:资源的可利用性与性别比例问题+编程知识+技术开发; 美赛真题...

    用Delphi7.0计算S=1+(1+2)+(1+2+3)+........+(1+2+3+.....+100)的和

    在编程领域,我们经常需要解决各种数学问题,其中包括序列求和。本示例涉及的是一个特殊的序列求和问题,即高斯求和。这个题目要求使用Delphi 7.0来计算1到100的阶乘和,也就是S=1+(1+2)+(1+2+3)+...+(1+2+3+...+100...

    sql servers 2005 com+ 问题

    #### 一、问题背景 在安装 SQL Server 2005 过程中,可能会遇到与 COM+ 相关的问题。这类问题通常表现为安装程序无法正常完成安装流程,或者在安装过程中提示与 COM+ 相关的错误信息。本文将详细介绍如何解决这些...

    spy++ lite版

    Spy++ Lite版是一款专为那些只安装了Visual Studio Express版,无法使用完整版Spy++的用户设计的轻量化工具。Spy++通常是一个强大的Windows应用程序,用于监控系统中的窗口、消息、线程和进程,它是Microsoft Visual...

Global site tag (gtag.js) - Google Analytics