鱼C论坛

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

一个小问题,求指导

[复制链接]
发表于 2014-8-18 11:09:11 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
  void main()
{
   int i=5,j=5,p=0,q=0;
   p=(i++)+(i++)+(i++);
   q=(++j)+(++j)+(++j);
   printf("%d,%d,%d,%d\n",p,q,i,j);

}

代码如上,执行结果为:15,22,8,8

请问“P”和“q”的值是如何算的?

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

使用道具 举报

发表于 2014-8-18 19:22:56 | 显示全部楼层
i++是先取i的值再++
++i是先++再取id值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-18 21:01:26 | 显示全部楼层
先算括号,至于自增去看视频吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-20 08:53:37 | 显示全部楼层
千寻0 发表于 2014-8-18 19:22
i++是先取i的值再++
++i是先++再取id值

恩,我算出来的是p=5+6+7=18,q=6+7+8=21,一个都没对上呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-21 10:55:30 | 显示全部楼层
瞳羽 发表于 2014-8-20 08:53
恩,我算出来的是p=5+6+7=18,q=6+7+8=21,一个都没对上呢

i++,编译器是先将i的值放到一个寄存器里面,然后计算的结果给p,寄存器再执行++过程,
++j是先把前两个++算出来然后再得知和后面的算
5:       int i=5,j=5,p=0,q=0;
00401028   mov         dword ptr [ebp-4],5
0040102F   mov         dword ptr [ebp-8],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]
0040104A   add         eax,dword ptr [ebp-4]
0040104D   mov         dword ptr [ebp-0Ch],eax
00401050   mov         ecx,dword ptr [ebp-4]
00401053   add         ecx,1
00401056   mov         dword ptr [ebp-4],ecx
00401059   mov         edx,dword ptr [ebp-4]
0040105C   add         edx,1
0040105F   mov         dword ptr [ebp-4],edx
00401062   mov         eax,dword ptr [ebp-4]
00401065   add         eax,1
00401068   mov         dword ptr [ebp-4],eax
7:       q=(++j)+(++j)+(++j);
0040106B   mov         ecx,dword ptr [ebp-8]
0040106E   add         ecx,1
00401071   mov         dword ptr [ebp-8],ecx
00401074   mov         edx,dword ptr [ebp-8]
00401077   add         edx,1
0040107A   mov         dword ptr [ebp-8],edx
0040107D   mov         eax,dword ptr [ebp-8]
00401080   add         eax,dword ptr [ebp-8]
00401083   mov         ecx,dword ptr [ebp-8]
00401086   add         ecx,1
00401089   mov         dword ptr [ebp-8],ecx
0040108C   add         eax,dword ptr [ebp-8]
0040108F   mov         dword ptr [ebp-10h],eax

你要学会看反汇编
这个问题是编译器的问题,不同机器运行结果可能不一样,这个问题没有必要深究
在编写程序的时候一般不要去用i++和++i的区别就是不要把他们写在一个含多个表达式的运算表达式里面
可移植性不强,只把他作为一条语句使用就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-22 09:59:45 | 显示全部楼层
千寻0 发表于 2014-8-21 10:55
i++,编译器是先将i的值放到一个寄存器里面,然后计算的结果给p,寄存器再执行++过程,
++j是先把前两个+ ...

谢谢,我学完C语言就学汇编
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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