帮忙解释一下C结果

来源:百度知道 编辑:UC知道 时间:2024/09/23 00:31:05
#include<stdio.h>
void main()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d",p,q);
}
运行得15,22
这个22是怎么来的,越详细越好,不懂的不要起哄凑热闹

不同的机器会有不同的答案,我的CPU是双核 T7250,跑出来的结果是15和24,
00411743 mov eax,dword ptr [j]
00411746 add eax,1
00411749 mov dword ptr [j],eax
0041174C mov ecx,dword ptr [j]
0041174F add ecx,1
00411752 mov dword ptr [j],ecx
00411755 mov edx,dword ptr [j]
00411758 add edx,1
0041175B mov dword ptr [j],edx
0041175E mov eax,dword ptr [j]
00411761 add eax,dword ptr [j]
00411764 add eax,dword ptr [j]
00411767 mov dword ptr [q],eax
上面是反汇编结果,看一眼就明白了,首先把5放到寄存器eax中,增加一,然后再赋值给j,这样的操作进行了三次,分别使用了寄存器eax ecx edx,最后,j的值是8,然后将j放到eax中,再将j(8)加两次,结果就是24,
这样的算式在不同的CPU和指令集上跑出来的结果是不一样的,你说的22也是有可能的,你可以用vs调试一下,把反汇编窗口调用出来看看就明白了,
这个问题只有研究价值,没有利用价值,在真正程序编写中应该避免使用这样的语句,因为会造成歧义

22就是q的结果了
q=(++j)+(++j)+(++j);
第一个++j 返回6 j=6
第二个++j 返回7 j=7
第三个++j 返回8 j=8
q=6+7+8=21
结果应该是18,21

呵呵.你错了.朋友