以下是引用wxz11191975在2011-8-30 17:57:11的发言:
#include<stdio.h>
fun(int x,int y) {return(x+y);}
int main()
{int a=1,b=2,c=3,sum;
sum=fun((a++,b++,a+b),c++);
printf("%d %d %d %d %d %d\n",a,a++,b,b++,a+b,sum);
system("PAUSE");
return 0;
}
程序运行后的结果是:3 2 4 3 5 8
不明白的是:怎么a和b分别变成了3和4的?
不同编译器结果不同!我这能这么说,我用了2个不同的编译器,得到不同的结果
3 2 4 3 7 8
2 2 3 3 5 8
建议不要深究此事,有点害人!
水平有限,注释难免有错误,请多包涵
vc6.0
int a=1,b=2,c=3,sum;
00401068 C7 45 FC 01 00 00 00 mov
dword ptr [ebp-4],1
;[ebp-4]相当于a,
a=1
0040106F C7 45 F8 02 00 00 00 mov
dword ptr [ebp-8],2 ;
[ebp-8]相当于b,
b=2
00401076 C7 45 F4 03 00 00 00 mov
dword ptr [ebp-0Ch],3; [ebp-0Ch]相当于c,c=3
sum=fun((a++,b++,a+b),c++);
0040107D 8B 45 FC
mov
eax,dword ptr [ebp-4];a的值给EAX
00401080 83 C0 01
add
eax,1
;a++
00401083 89 45 FC
mov
dword ptr [ebp-4],eax
00401086 8B 4D F8
mov
ecx,dword ptr [ebp-8]
00401089 83 C1 01
add
ecx,1
;b++
0040108C 89 4D F8
mov
dword ptr [ebp-8],ecx
0040108F 8B 55 F4
mov
edx,dword ptr [ebp-0Ch] ;取c的值放入edx,此时c=3
00401092 89 55 EC
mov
dword ptr [ebp-14h],edx;放到地址[ebp-14h]=3,临时的
00401095 8B 45 EC
mov
eax,dword ptr [ebp-14h];数值3放入EAX
00401098 50
push
eax
;压入参数y=3,
00401099 8B 4D FC
mov
ecx,dword ptr [ebp-4]
;ecx=a=2
0040109C 03 4D F8
add
ecx,dword ptr [ebp-8]
;eax=a+b=2+3
0040109F 51
push
ecx
;压入参数x=5
004010A0 8B 55 F4
mov
edx,dword ptr [ebp-0Ch]
004010A3 83 C2 01
add
edx,1
;c++
004010A6 89 55 F4
mov
dword ptr [ebp-0Ch],edx
;c=4
004010A9 E8 5C FF FF FF
call
@ILT+5(fun) (0040100a) ;fun()
004010AE 83 C4 08
add
esp,8
004010B1 89 45 F0
mov
dword ptr [ebp-10h],eax ;返回值存在sum中[ebp-10h]
执行到此a=2,b=3,c=4,sum=8
printf("%d %d %d %d %d %d\n",a,a++,b,b++,a+b,sum);
004010B4 8B 45 F0
mov
eax,dword ptr [ebp-10h]
004010B7 50
push
eax
;传参sum=8
004010B8 8B 4D FC
mov
ecx,dword ptr [ebp-4]
;a=2放入ecx
004010BB 03 4D F8
add
ecx,dword ptr [ebp-8]
;a+b=2+3=5
004010BE 51
push
ecx
;传参a+b(5)
004010BF 8B 55 F8
mov
edx,dword ptr [ebp-8]
;b=3
004010C2 89 55 E8
mov
dword ptr [ebp-18h],edx ;
004010C5 8B 45 E8
mov
eax,dword ptr [ebp-18h] ;eax=b=3
004010C8 50
push
eax
;传参b++
004010C9 8B 4D F8
mov
ecx,dword ptr [ebp-8]
;ecx=b=3
004010CC 51
push
ecx
;传参b
004010CD 8B 55 FC
mov
edx,dword ptr [ebp-4]
;edx=a=2
004010D0 89 55 E4
mov
dword ptr [ebp-1Ch],edx
004010D3 8B 45 E4
mov
eax,dword ptr [ebp-1Ch] ;eax=edx=a=2
004010D6 50
push
eax
;传参a++;
004010D7 8B 4D FC
mov
ecx,dword ptr [ebp-4]
ecx=a=2
004010DA 51
push
ecx
;传参 a
004010DB 68 1C 20 42 00
push
offset string "%d %d %d %d %d %d\n" (0042201c);取格式输出的地址
004010E0 8B 55 FC
mov
edx,dword ptr [ebp-4]
;edx=a=2
004010E3 83 C2 01
add
edx,1
;此时才开始计算printf中的 a++
004010E6 89 55 FC
mov
dword ptr [ebp-4],edx
; a=3
004010E9 8B 45 F8
mov
eax,dword ptr [ebp-8]
;eax=b=2
004010EC 83 C0 01
add
eax,1
;此时才开始计算printf中的 b++
004010EF 89 45 F8
mov
dword ptr [ebp-8],eax
;b=4
004010F2 E8 49 00 00 00
call
printf (00401140)
;调用printf函数,输出
输出结果 2 2 3 3 5 8
004010F7 83 C4 1C
add
esp,1Ch
至此:a=3,b=4,c=4,sum=8
这里仅以vc6.0编译的作为例子说明一下,标注的不专业,希望能说明问题
如果你得到了不同的结果那就要看其汇编指令是如何实现的,也就是编译器如何处理的了
所以说,研究类似的问题,对于初学者来说有点害人的意思,哈哈,个人观点,希望大家不要较真,娱乐一下而已!
[
本帖最后由 Luminal 于 2011-8-30 19:32 编辑 ]