本帖最后由 friendan 于 2013-11-10 20:27 编辑
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--,
否则结果难以预料,听说这跟编译器有关,如何改进,我会给一个例子你参考。
你不明白q为什么等于22,我从汇编的角度讲给你听吧,具体请看下面的汇编代码,
我的编译器是VC6的,其它的编译器结果可能不同,请铭记忠告:
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--
从汇编的角度看,不难发现,程序先算前面两个(++j)+(++j),所算结果为14,
然后程序再算最后一个(++j),所算结果为8
最后14+8=2215: q=(++j)+(++j)+(++j);//汇编代码如下
0040104F 8B 45 FC mov eax,dword ptr [ebp-4] //从内存取j的值放到eax中
00401052 83 C0 01 add eax,1 //j=j+1
00401055 89 45 FC mov dword ptr [ebp-4],eax //将j的值放回内存,此时j为6
00401058 8B 4D FC mov ecx,dword ptr [ebp-4] //从内存取j的值放到ecx中
0040105B 83 C1 01 add ecx,1 //j=j+1
0040105E 89 4D FC mov dword ptr [ebp-4],ecx //将j的值放回内存,此时j为7
00401061 8B 55 FC mov edx,dword ptr [ebp-4] //从内存取j的值放到edx中
00401064 03 55 FC add edx,dword ptr [ebp-4] //edx=edx+7=7+7=14
00401067 8B 45 FC mov eax,dword ptr [ebp-4] //从内存取j的值放到eax中
0040106A 83 C0 01 add eax,1//j=j+1
0040106D 89 45 FC mov dword ptr [ebp-4],eax //将j的值放回内存,此时j为8
00401070 03 55 FC add edx,dword ptr [ebp-4] //edx=edx+j=14+8=22
00401073 89 55 F8 mov dword ptr [ebp-8],edx //将计算结果赋给q,即q=22
如果你想获得预期的结果,请将程序修改如下:#include <stdio.h>
void main ()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j);
q=q+(++j);
q=q+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
}
效果截图:
再次忠告:
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--
否则编译器不同,结果难以预料。
|