qiangrenliwei 发表于 2016-10-3 07:54:13

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


#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
各位高手能给解释一下吗,谢谢!

qiangrenliwei 发表于 2016-10-3 08:41:43

为什么会得这个数呢?

mingcxx 发表于 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

orino 发表于 2016-10-13 20:16:02

取决于编译器是怎么翻译这句话的,你可以查看你的编译器反汇编后的结果,看他是怎么操作的

花开自有丶花落 发表于 2016-10-15 09:46:26

取决于编译器的原因是:顺序点,语句中的分号是一个顺序点,意味着在处理下一条语句前,所有赋值递增递减等的计算都要完成,也就是说在到达顺序点前,各种递增递减的运算都会在不定时刻完成。
关于顺序点的形式有很多,可以自己查一下
页: [1]
查看完整版本: 小甲鱼老师的一道例题不会求解