鱼C论坛

 找回密码
 立即注册
查看: 3001|回复: 4

小甲鱼老师的一道例题不会求解

[复制链接]
发表于 2016-10-3 07:54:13 | 显示全部楼层 |阅读模式

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

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

x

#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);
}

最后输出是
15,22,8,8
各位高手能给解释一下吗,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-3 08:41:43 | 显示全部楼层
为什么会得这个数呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-3 13:42:41 | 显示全部楼层
本帖最后由 mingcxx 于 2016-10-3 13:45 编辑

p=(i++)+(i++)+(i++);语句执行完时i递增了3次,所以是8。同理,j也是8
p是15说明在上面这个表达式里,编译器只计算了一次i++(至于是哪一个i++就不知道了)的值5,那么p=5+5+5=15;
q是22,没想出来,21的话倒是可以说是编译器依次计算了三次++j(这三个的顺序问题也不知道)得到6+7+8 =21,。
如果你学C是应付考试的,那么请忽略下面的话。
建议别死扣这种写法了。同一行里最好不要有多个加加减减的语句,因为计算的结果是无法确定的。这取决于编译器。比如我用vs2013计算结果是q=24,说明编译器先进行了三次++j,j等于8,最后代入q=(++j)+(++j)+(++j)=8+8+8=24
360截图20161003134313260.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-13 20:16:02 | 显示全部楼层
取决于编译器是怎么翻译这句话的,你可以查看你的编译器反汇编后的结果,看他是怎么操作的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-15 09:46:26 | 显示全部楼层
取决于编译器的原因是:顺序点,语句中的分号是一个顺序点,意味着在处理下一条语句前,所有赋值递增递减等的计算都要完成,也就是说在到达顺序点前,各种递增递减的运算都会在不定时刻完成。
关于顺序点的形式有很多,可以自己查一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 13:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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