为什么这道题C语言和Java的输出值不同?

int i = 3,k;
k = (i++)+(i++);
在C语言中输出k=6;i=5
在Java中输出k=7;i=5
请问为什么?

4个回答

首先分析一下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的操作。

这下明白为什么k=6,i=5了吧。

然后再来看看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]

第三和第七是自动加一,第十一是给k赋值。

看出来区别了吧,
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能解释。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐