++问题

 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++中重载++运算符很相似
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值