鱼C论坛

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

在做++x例题时遇到两题不懂的,求各位鱼友解答?

[复制链接]
发表于 2012-1-11 07:32:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 伪猫君 于 2012-1-11 16:26 编辑

#include "stdio.h"

void main ()
{
        int i=5,j=5,p,q;
    p=(i++)+(i++)+(i++);
        q=(++j)+(++j)+(++j);
        printf("%d,%d,%d,%d",p,q,i,j);
}
为什么运算出来q=22?
q不应该是6+7+8=21?



还有
#include "stdio.h"

void main()
{
        int i=8;
                printf("%d\n",++i);
                printf("%d\n",--i);
                printf("%d\n",i++);
                printf("%d\n",i--);
                printf("%d\n",-i++);
                printf("%d\n",-i--);
}
这题 为什么 i++=8不是=9   i--=9不是=7
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-11 15:59:19 | 显示全部楼层
我是用VC 6.0  从反汇编看
p = (i++)+(i++)+(i++);
0040D466   mov         eax,dword ptr [ebp-4]
0040D469   add         eax,dword ptr [ebp-4]
0040D46C   add         eax,dword ptr [ebp-4]
0040D46F   mov         dword ptr [ebp-0Ch],eax
0040D472   mov         ecx,dword ptr [ebp-4]
0040D475   add         ecx,1
0040D478   mov         dword ptr [ebp-4],ecx
0040D47B   mov         edx,dword ptr [ebp-4]
0040D47E   add         edx,1
0040D481   mov         dword ptr [ebp-4],edx
0040D484   mov         eax,dword ptr [ebp-4]
0040D487   add         eax,1
0040D48A   mov         dword ptr [ebp-4],eax

一开始直接就取了i 的值 加了3次 再把该值p保存起来 再进行i 的三次自加

而下面的
q = (++j)+(++j)+(++j);
0040D48D   mov         ecx,dword ptr [ebp-8]
0040D490   add         ecx,1
0040D493   mov         dword ptr [ebp-8],ecx
0040D496   mov         edx,dword ptr [ebp-8]
0040D499   add         edx,1
0040D49C   mov         dword ptr [ebp-8],edx
0040D49F   mov         eax,dword ptr [ebp-8]
0040D4A2   add         eax,dword ptr [ebp-8]
0040D4A5   mov         ecx,dword ptr [ebp-8]
0040D4A8   add         ecx,1
0040D4AB   mov         dword ptr [ebp-8],ecx
0040D4AE   add         eax,dword ptr [ebp-8]
0040D4B1   mov         dword ptr [ebp-10h],eax

取出j 值 先自加1 再存放回去 又取出J值 再自加1 存放回去  取出j 值 这时候为7了 使j+j =14 存放在eax寄存器 再取出j 把j自加1 j = 8    把q = eax+ j = 22
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-11 16:06:26 | 显示全部楼层
下面的那个

++i  是先加 所以 i = 9
--i 是先减 所以 i = 8
i++ 是后加 这里打印的 还是8  这条执行完后进行+ 也就是说下一条的时候i 为 9
i-- 是后减 上面传下来是 9  这条执行完后 为8
-i++ 上面传下来的是 8 所以为 -8 这条执行完后 i 为9
-i--   上面传下来为9 所以为-9   执行完这条后 i为8
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-11 16:06:39 | 显示全部楼层
下面的那个

++i  是先加 所以 i = 9
--i 是先减 所以 i = 8
i++ 是后加 这里打印的 还是8  这条执行完后进行+ 也就是说下一条的时候i 为 9
i-- 是后减 上面传下来是 9  这条执行完后 为8
-i++ 上面传下来的是 8 所以为 -8 这条执行完后 i 为9
-i--   上面传下来为9 所以为-9   执行完这条后 i为8
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-11 16:17:24 From FishC Mobile | 显示全部楼层
++前置的是运算前自加,而后置是运算后再加(不是不加)
楼主可以试试先输出i++再输出i的值
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-1-11 16:25:34 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-10 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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