batcj1 发表于 2013-10-13 10:53:50

++符号的问题,新手不怎么懂

#include<stdio.h>
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,不知道怎么来的。我是不知道怎么运算,希望 前辈们给我讲透彻一点,万分感谢!


福禄娃娃 发表于 2013-10-13 10:53:51

batcj1 发表于 2013-10-13 12:36 static/image/common/back.gif
为什么算q的时候先增加2次到7,进行7+7,再自增一次到8,再计算7+7+8呢,这个好迷茫?

和编译器的优化处理过程有关,CPU也有乱序执行这个可能。
不用太纠结这种问题,一般不会写这么多i++ ++i的语句,会造成不可预料的结果
除了在for循环中用i++或++i
其他地方尽量写成i = i + 1

福禄娃娃 发表于 2013-10-13 10:59:06

本帖最后由 福禄娃娃 于 2013-10-13 11:07 编辑

编译器不同,具体差距看反汇编结果
你的为 p = 5 +5 +5 =15i用完再自增为8
q= 7+ 7+ 8 =22j先自增两次,前两项然后相加,j再自增一次,第三项和前面的值相加。j为8

在VC或者VS中F9下个断点,然后F5调试,Alt+8查看反汇编代码
下面是反汇编代码5:      int i = 5,j = 5,p = 0,q = 0;
00401028   mov         dword ptr ,5             i = 5
0040102F   mov         dword ptr ,5             j =5
00401036   mov         dword ptr ,0
0040103D   mov         dword ptr ,0
6:      p = (i++) + (i++) + (i++);
00401044   mov         eax,dword ptr
00401047   add         eax,dword ptr                5+5=10
0040104A   add         eax,dword ptr                10+5=15
0040104D   mov         dword ptr ,eax
00401050   mov         ecx,dword ptr
00401053   add         ecx,1                                 i自增一次 i = 6
00401056   mov         dword ptr ,ecx
00401059   mov         edx,dword ptr
0040105C   add         edx,1                              i自增一次i =7
0040105F   mov         dword ptr ,edx
00401062   mov         eax,dword ptr
00401065   add         eax,1                                 i自增一次i = 8
00401068   mov         dword ptr ,eax
7:      q = (++j) + (++j) + (++j);
0040106B   mov         ecx,dword ptr
0040106E   add         ecx,1                                  j自增一次j = 6
00401071   mov         dword ptr ,ecx
00401074   mov         edx,dword ptr
00401077   add         edx,1                                  j自增一次j = 7
0040107A   mov         dword ptr ,edx
0040107D   mov         eax,dword ptr
00401080   add         eax,dword ptr                    7 + 7 = 14
00401083   mov         ecx,dword ptr
00401086   add         ecx,1                                 j自增一次    j = 8
00401089   mov         dword ptr ,ecx
0040108C   add         eax,dword ptr                    14 + 8 = 22
0040108F   mov         dword ptr ,eax

batcj1 发表于 2013-10-13 12:36:47

福禄娃娃 发表于 2013-10-13 10:59 static/image/common/back.gif
编译器不同,具体差距看反汇编结果
你的为 p = 5 +5 +5 =15i用完再自增为8
q= 7+ 7+ 8 =22j先自增两次 ...

为什么算q的时候先增加2次到7,进行7+7,再自增一次到8,再计算7+7+8呢,这个好迷茫?

牡丹花下死做鬼 发表于 2013-10-13 12:42:04

batcj1 发表于 2013-10-13 12:36 static/image/common/back.gif
为什么算q的时候先增加2次到7,进行7+7,再自增一次到8,再计算7+7+8呢,这个好迷茫?

编译器优化的结果 编译器不同结果也会不同 具体是怎么样你要自己反汇编看代码

落雨丶随风 发表于 2013-10-15 13:30:02

i++和++i是不同的,i++是整个表达式执行完i的值才会改变,++i刚好相反,这就是后自增和前自增最大的区别.....
页: [1]
查看完整版本: ++符号的问题,新手不怎么懂