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
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返回
也就是说这个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++中重载++运算符很相似