鱼C论坛

 找回密码
 立即注册
查看: 3008|回复: 12

关于 i++ 和 ++i 的问题求助

[复制链接]
发表于 2012-3-11 17:24:40 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. void main()
  3. {
  4. int i = 5,j = 5,p,q;
  5. p=(i++)+(i++)+(i++);
  6. q=(++j)+(++j)+(++j);
  7. printf("%d,%d,%d,%d",p,q,i,j);
  8. }
复制代码
i++是先做运算再自增1,++i是先自增1然后做运算
那么运行结果不应该是P=5+6+7=18,q=6+7+8=21吗?为什么结果却不是这样的?
C_003.GIF




                               
登录/注册后可看大图
该贴已经同步到 风剑河的微博
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-11 18:02:31 | 显示全部楼层
好像是根据计算机系统内部设计不一样,所以结果也不一样,不知道对不对,我的结果也与教学里的不一样.
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-11 18:21:52 | 显示全部楼层
p=(i++)+(i++)+(i++);

i=5开始,i++是先赋值后加一,
而且,你要搞明白优先级:括号比加号和等号都高。
所以先计算括号内的,每次都是i++,i的值其实还是5,然后相加得15,然后i进行三次++动作。
也就是说,进行完此步之后i = 8了。

下面的同样如此
q=(++j)+(++j)+(++j);

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-11 18:24:02 | 显示全部楼层
{:1_1:}你去看看这本书把:c陷阱与缺陷,
论坛里头就有,看过之后你就明白了
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-11 18:37:35 | 显示全部楼层
arkhe 发表于 2012-3-11 18:21
p=(i++)+(i++)+(i++);

i=5开始,i++是先赋值后加一,

i++是先赋值后加一,括号是最优先的运算符,难道说比“先赋值后加一”中的“加”都要优先??硬生生插入其中了?你的意思是其运算过程是:
p=(i++)+(i++)+(i++)
  =(i 赋值)+(i 赋值)+(i 赋值);i=i+1; i=i+1; i=i+1;
=5+5+5; i=i+1; i=i+1; i=i+1;
  =15;i=8
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-11 18:43:08 | 显示全部楼层
还是迷惑,如果我上面的理解是对的,那么
q=(++j)+(++j)+(++j)又该怎么理解?
++i为先加1后赋值?也应该是q=6+7+8的呀
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-11 18:48:21 | 显示全部楼层
这个是在c标准中没定义的东西,一般结果是按照楼主所得到的结果。
但有的编译器不是如此,得到的结果就是你想的那样。。。。

根本原因是c标准没有定义怎么去执行,然后....就看编译器了
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-11 18:53:05 | 显示全部楼层
arkhe 发表于 2012-3-11 18:48
这个是在c标准中没定义的东西,一般结果是按照楼主所得到的结果。
但有的编译器不是如此,得到的结果就是你 ...

貌似小甲鱼在讲汇编的时候顺带提了一下i++和++i 的问题,看来只有等到学会在VC++6.0中将C代码转化为汇编代码的时候才能研究透了。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-11 21:52:56 | 显示全部楼层
不要纠结与 这个 每个编译器都不一样
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-12 13:41:56 | 显示全部楼层
楼主最好不要再同一个语句里面使用太多的 一个变量的自加或者自减,
不同的编译器 会在不同的地方给i加上1 。
编程里面不提倡这种用法,会产生不必要的麻烦和错误。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-12 15:30:50 | 显示全部楼层
F9  F10你懂的;
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-12 15:32:11 | 显示全部楼层
加多1句,不同编译不同结果,楼主知道有这么一个东西就行了,将来循环的时候会用就OK了;闪人了;
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-12 23:36:27 | 显示全部楼层
楼主还是学汇编吧,我也纠结呢
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-12 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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