++符号的问题,新手不怎么懂
#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,不知道怎么来的。我是不知道怎么运算,希望 前辈们给我讲透彻一点,万分感谢!
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 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 福禄娃娃 发表于 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呢,这个好迷茫? batcj1 发表于 2013-10-13 12:36 static/image/common/back.gif
为什么算q的时候先增加2次到7,进行7+7,再自增一次到8,再计算7+7+8呢,这个好迷茫?
编译器优化的结果 编译器不同结果也会不同 具体是怎么样你要自己反汇编看代码
i++和++i是不同的,i++是整个表达式执行完i的值才会改变,++i刚好相反,这就是后自增和前自增最大的区别.....
页:
[1]