新手求助++,--的问题 求帮忙
#include <stdio.h>void main ()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
}
他这个答案是怎么算的???p=15,我明白了 可是Q为什么=22呢?
{:1_1:}论坛有过这样的问题关于i++问题?
这是之前一小伙伴问的
http://bbs.fishc.com/thread-40050-1-1.html
http://bbs.fishc.com/forum.php?mod=viewthread&tid=32410 本帖最后由 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 //从内存取j的值放到eax中
00401052 83 C0 01 add eax,1 //j=j+1
00401055 89 45 FC mov dword ptr ,eax //将j的值放回内存,此时j为6
00401058 8B 4D FC mov ecx,dword ptr //从内存取j的值放到ecx中
0040105B 83 C1 01 add ecx,1//j=j+1
0040105E 89 4D FC mov dword ptr ,ecx //将j的值放回内存,此时j为7
00401061 8B 55 FC mov edx,dword ptr //从内存取j的值放到edx中
00401064 03 55 FC add edx,dword ptr //edx=edx+7=7+7=14
00401067 8B 45 FC mov eax,dword ptr //从内存取j的值放到eax中
0040106A 83 C0 01 add eax,1//j=j+1
0040106D 89 45 FC mov dword ptr ,eax //将j的值放回内存,此时j为8
00401070 03 55 FC add edx,dword ptr //edx=edx+j=14+8=22
00401073 89 55 F8 mov dword ptr ,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);
}
效果截图:
再次忠告:
无论是++还是--,同一个变量在一行代码中最好不要超过一次进行连续的++或--
否则编译器不同,结果难以预料。
我觉得没有必要纠结这个,因为不同的编程器和不同的平台结果不一样,还有实际编程中不会这样写的。 {:1_1:}加油 楼主 还有这种事,长见识了!
页:
[1]