sunchaov1 发表于 2015-3-18 00:00:20

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

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

s1986q 发表于 2015-3-18 09:36:31

vc6.0反汇编看看可能优化了。

秀丽江山 发表于 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++;..........};

雪是梅之香 发表于 2015-3-18 12:17:51

解释一下合在一起的吧
刚开始 j=5
q=(++j)+(++j)+(++j)
编译器在运行的时候,首先是将前两个(++j)运算完之后,才进行这两个之间的相加
此时j=7,(++j)+(++j)=14,此时再进行第三次自加,j=8,q=14+8=22了

marlon 发表于 2015-3-18 13:22:02

#4楼已经解释清楚了
这是VC6.0的汇编代码,楼主有兴趣可以自己看看:
18:       q = (++j)+(++j)+(++j);
0040D7CB   mov         eax,dword ptr
0040D7CE   add         eax,1
0040D7D1   mov         dword ptr ,eax
0040D7D4   mov         ecx,dword ptr
0040D7D7   add         ecx,1
0040D7DA   mov         dword ptr ,ecx
0040D7DD   mov         edx,dword ptr
0040D7E0   add         edx,dword ptr
0040D7E3   mov         eax,dword ptr

yhh2530080997 发表于 2015-3-18 22:31:32

这个是编译器优化后的结果,++ --的问题不同的编译器可能有不同的优化,这个,如果懂汇编语言的话,建议看一下反汇编,了解一下,是如何优化的,这个是初学者容易搞混的,努力吧!!!:lol::lol::lol:

望望 发表于 2015-3-24 16:58:15

佩服啊,还以为自己水平不错了呢,原来还有这么多东西不懂,向大家学习了啊!{:1_1:}
页: [1]
查看完整版本: 小白求教,为什么分开和合起来结果算出来的不一样