|
发表于 2013-11-10 20:22:49
|
显示全部楼层
本帖最后由 friendan 于 2013-11-10 20:27 编辑
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--,
否则结果难以预料,听说这跟编译器有关,如何改进,我会给一个例子你参考。
你不明白q为什么等于22,我从汇编的角度讲给你听吧,具体请看下面的汇编代码,
我的编译器是VC6的,其它的编译器结果可能不同,请铭记忠告:
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--
从汇编的角度看,不难发现,程序先算前面两个(++j)+(++j),所算结果为14,
然后程序再算最后一个(++j),所算结果为8
最后14+8=22
- 15: 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);
- }
复制代码
效果截图:
再次忠告:
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--
否则编译器不同,结果难以预料。
|
|