int i = 3,k;
k = (i++)+(i++);
在C语言中输出k=6;i=5
在Java中输出k=7;i=5
请问为什么?
首先分析一下c的情况。
我们用vs2008的反汇编工具,对代码进行反汇编,汇编结果如下。
[code="java"]
k=(i++)+(i++);
01051395 mov eax,dword ptr [i]
01051398 add eax,dword ptr [i]
0105139B mov dword ptr [k],eax
0105139E mov ecx,dword ptr [i]
010513A1 add ecx,1
010513A4 mov dword ptr [i],ecx
010513A7 mov edx,dword ptr [i]
010513AA add edx,1
010513AD mov dword ptr [i],edx
[/code]
可以看出来,前面两句是i+i,结果放在寄存器eax中,第三句就是把寄存器eax值赋给K。后面几句就是对i进行两次加1的操作。
然后再来看看java中的原理。
依然使用反编译:代码如下:
code:
[code="java"]0:iconst_3
1:istore_1
2:iload_1
3:iinc 1,1
6:iload_1
7:iinc 1,1
10:iadd
11:istore_2
12:return[/code]
看出来区别了吧,
c下,先赋值给k,再两次++
在java下,先加,最后赋值。
不同编程语言处理不一样而已,底层机制不同嘛
k = (i++)+(i++);
c:
先取出两个i,相加赋值给k,再计算两个i自增
java:
先把左边的i取出来(3),保存到临时变量(假设a),再把i自增,在把右边的(i++)中的i取出来(已经变成4)保存到临时变量(假设b),再把i自增,最好把a+b的值赋值给k
执行的顺序不一样。
补充一点:上面措辞有点小问题,
分析java时,使用的不是反编译,因为反编译过程是class文件到java文件。
正确说是反汇编。而这种汇编语言只有jVM能解释。