鱼C论坛

 找回密码
 立即注册
查看: 2742|回复: 5

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

[复制链接]
发表于 2013-10-13 10:53:50 | 显示全部楼层 |阅读模式
2鱼币
#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,不知道怎么来的。我是不知道怎么运算,希望 前辈们给我讲透彻一点,万分感谢!


最佳答案

查看完整内容

和编译器的优化处理过程有关,CPU也有乱序执行这个可能。 不用太纠结这种问题,一般不会写这么多i++ ++i的语句,会造成不可预料的结果 除了在for循环中用i++或++i 其他地方尽量写成i = i + 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-13 10:53:51 | 显示全部楼层

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

评分

参与人数 1鱼币 +2 收起 理由
batcj1 + 2

查看全部评分

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

使用道具 举报

发表于 2013-10-13 10:59:06 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-10-13 11:07 编辑

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

在VC或者VS中F9下个断点,然后F5调试,Alt+8查看反汇编代码
下面是反汇编代码
5:        int i = 5,j = 5,p = 0,q = 0;
00401028   mov         dword ptr [ebp-4],5             i = 5
0040102F   mov         dword ptr [ebp-8],5             j =5
00401036   mov         dword ptr [ebp-0Ch],0
0040103D   mov         dword ptr [ebp-10h],0
6:        p = (i++) + (i++) + (i++);
00401044   mov         eax,dword ptr [ebp-4]
00401047   add         eax,dword ptr [ebp-4]                 5+5=10
0040104A   add         eax,dword ptr [ebp-4]                 10+5=15
0040104D   mov         dword ptr [ebp-0Ch],eax
00401050   mov         ecx,dword ptr [ebp-4]
00401053   add         ecx,1                                 i自增一次 i = 6
00401056   mov         dword ptr [ebp-4],ecx
00401059   mov         edx,dword ptr [ebp-4]
0040105C   add         edx,1                                i自增一次  i =7 
0040105F   mov         dword ptr [ebp-4],edx
00401062   mov         eax,dword ptr [ebp-4]
00401065   add         eax,1                                 i自增一次  i = 8
00401068   mov         dword ptr [ebp-4],eax
7:        q = (++j) + (++j) + (++j);
0040106B   mov         ecx,dword ptr [ebp-8]
0040106E   add         ecx,1                                  j自增一次  j = 6
00401071   mov         dword ptr [ebp-8],ecx
00401074   mov         edx,dword ptr [ebp-8]
00401077   add         edx,1                                  j自增一次  j = 7 
0040107A   mov         dword ptr [ebp-8],edx
0040107D   mov         eax,dword ptr [ebp-8]
00401080   add         eax,dword ptr [ebp-8]                   7 + 7 = 14
00401083   mov         ecx,dword ptr [ebp-8]
00401086   add         ecx,1                                   j自增一次    j = 8
00401089   mov         dword ptr [ebp-8],ecx
0040108C   add         eax,dword ptr [ebp-8]                   14 + 8 = 22
0040108F   mov         dword ptr [ebp-10h],eax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-13 12:36:47 | 显示全部楼层
福禄娃娃 发表于 2013-10-13 10:59
编译器不同,具体差距看反汇编结果
你的为 p = 5 +5 +5 =15  i用完再自增为8
q= 7+ 7+ 8 =22  j先自增两次 ...

为什么算q的时候先增加2次到7,进行7+7,再自增一次到8,再计算7+7+8呢,这个好迷茫?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-13 12:42:04 | 显示全部楼层
batcj1 发表于 2013-10-13 12:36
为什么算q的时候先增加2次到7,进行7+7,再自增一次到8,再计算7+7+8呢,这个好迷茫?

编译器优化的结果 编译器不同结果也会不同 具体是怎么样你要自己反汇编看代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-15 13:30:02 | 显示全部楼层
i++和++i是不同的,i++是整个表达式执行完i的值才会改变,++i刚好相反,这就是后自增和前自增最大的区别.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 21:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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