i=2;
k=(i++)+(++i)+(++i);
这中题确实没意思。
在不同的编译器中,得到的答案或许不同。
标准规定符号按优先级计算,但在优先级相同的情况下并没有规定谁先执行。
其实看下反汇编就明白了。
看下面的再VC6和VS2005下的反汇编代码就清楚了。、

程序代码:
VC6
5: int h=(i++)+(++i)+(++i);
0040D74F mov eax,dword ptr [ebp-4] i的值2放入eax
0040D752 add eax,1 //eax+1
0040D755 mov dword ptr [ebp-4],eax // eax的值赋值给i,此时i=3
0040D758 mov ecx,dword ptr [ebp-4]
0040D75B add ecx,dword ptr [ebp-4] // eax中的值与i相加 此时 eax的值为 6
0040D75E mov edx,dword ptr [ebp-4] //将i的值(i=3)放入edx
0040D761 add edx,1
0040D764 mov dword ptr [ebp-4],edx //edx加1后 赋值给i,此时i=4
0040D767 add ecx,dword ptr [ebp-4] ecx与i相加 此时ecx为10
0040D76A mov dword ptr [ebp-8],ecx //将ecx的值赋值给 k,k=10
0040D76D mov eax,dword ptr [ebp-4] //再取得i的值放入eax ,此时i=4
0040D770 add eax,1 //eax+1
0040D773 mov dword ptr [ebp-4],eax //eax赋值给i ,此时i=5;
6: printf("%d",h);
0040D776 mov ecx,dword ptr [ebp-8] //k的值为10
0040D779 push ecx
0040D77A push offset string "%d" (00422fa4)
0040D77F call printf (004010a0)
VS2005
int h=(i++)+(++i)+(++i);
004113B5 mov eax,dword ptr [i]
004113B8 add eax,1
004113BB mov dword ptr [i],eax
004113BE mov ecx,dword ptr [i]
004113C1 add ecx,1 //上面和VC下的相同,看后面就不一样了
004113C4 mov dword ptr [i],ecx //先计算了两次++i,此时i=4
004113C7 mov edx,dword ptr [i]
004113CA add edx,dword ptr [i]
004113CD add edx,dword ptr [i]
004113D0 mov dword ptr [h],edx //到这里三个i相加结果存入h,此时h=12,i=4
004113D3 mov eax,dword ptr [i]
004113D6 add eax,1
004113D9 mov dword ptr [i],eax //i再次加1;