鱼C论坛

 找回密码
 立即注册
查看: 1491|回复: 6

小白求教,为什么分开和合起来结果算出来的不一样

[复制链接]
发表于 2015-3-18 00:00:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
两个q算出来的不一样,差了1。。没搞明白,请高人指点。

q=21

q=21

q=22

q=22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-18 09:36:31 | 显示全部楼层
vc6.0反汇编看看可能优化了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-18 10:00:37 | 显示全部楼层
废话。分开和合起来的当然不一样!!
如:
int a=0;
int c=1+a++;
结果c的值为1,这么想吧,在同一个语句中,a++是a先参与运算,再进行a++;
上面相当于
int c=1+a;
a++;
这时a++好像实际没作用。
而++a中,不管如何,你先把a先加一再说。
比如:
int   a=0,b=0;
if  (a++ ==b++ )
{...............};
和这个一样效果
int   a=b=0;
if  (a++  ==b)
{  b++;..........};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-3-18 12:17:51 | 显示全部楼层
解释一下合在一起的吧
刚开始 j=5
q=(++j)+(++j)+(++j)
编译器在运行的时候,首先是将前两个(++j)运算完之后,才进行这两个之间的相加
此时j=7,(++j)+(++j)=14,此时再进行第三次自加,j=8,q=14+8=22了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-18 13:22:02 | 显示全部楼层
#4楼已经解释清楚了
这是VC6.0的汇编代码,楼主有兴趣可以自己看看:
18:       q = (++j)+(++j)+(++j);
0040D7CB   mov         eax,dword ptr [ebp-4]
0040D7CE   add         eax,1
0040D7D1   mov         dword ptr [ebp-4],eax
0040D7D4   mov         ecx,dword ptr [ebp-4]
0040D7D7   add         ecx,1
0040D7DA   mov         dword ptr [ebp-4],ecx
0040D7DD   mov         edx,dword ptr [ebp-4]
0040D7E0   add         edx,dword ptr [ebp-4]
0040D7E3   mov         eax,dword ptr [ebp-4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-3-18 22:31:32 | 显示全部楼层
这个是编译器优化后的结果,++ --的问题不同的编译器可能有不同的优化,这个,如果懂汇编语言的话,建议看一下反汇编,了解一下,是如何优化的,这个是初学者容易搞混的,努力吧!!!:lol::lol::lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-24 16:58:15 | 显示全部楼层
佩服啊,还以为自己水平不错了呢,原来还有这么多东西不懂,向大家学习了啊!{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 19:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表