C语言关于p=(i++)+(i++)+(i++)=18,q=(++j)+(++j)+(++j)=22的问题,不同编译器运算不一样,我用的编译器是Code::Blocks 17.12,新人驾到,多多指教

**#include <stdio.h>
#include <stdlib.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);
}
这个问题确实坑,我以前感觉不是很重要,现在突然发神经搞清楚规律了。
我运算结果如下:
在这里插入图片描述
这是逛贴吧看到的结果
在这里插入图片描述
18,22与15,24什么鬼,本想用汇编看看怎么回事,但看了感觉太难受索性多运算一下看看怎么回事,什么规律。我用的编译器是Code::Blocks 17.12,以p=18,q=22,i=8,j=8的运算规律来分析,第一张图的。
第一次p=5,q=6,i=6,j=6
在这里插入图片描述
第二次p=11,q=14,i=7,j=7
在这里插入图片描述
第三次p=18,q=22,i=8,j=8
在这里插入图片描述
第四次p=26,q=31,i=9,j=9
在这里插入图片描述
第五次p=35,q=41,i=10,j=10
在这里插入图片描述
第六次p=45,q=52,,i=11,j=11
在这里插入图片描述
由此可推断
第一次:p=5,q=6,i=6,j=6:
p=(i++)=5
q=(++j)=6
(++号优先级大于+号,++号自右向左,+号自左向右)
这里有很多疑问,三个问题
1.++i,–i,i++,i–运算方式与规律,这四个怎么互相影响的
2.+号怎么限制++号的
3,i,j值的变化
4,i,j值的规律
第二次p=11,q=14,i=7,j=7:
p=(i++)+(i++)=5+6=11
q=(++j)+(++j)=7+7=14
(3,i,j值的变化)这个问题解决了,六个例子i,j全都依次递增
(4,i,j值的规律)仍有疑问,但是明白了什么有几个++号,就加几个一,可具体怎么运算的?
第三次p=18,q=22,i=8,j=8:
p=(i++)+(i++)+(i++)=5+6+7=18
q=(++j)+(++j)+(++j)=7+7+8=22
~ 你一定疑问第二次q中为什么7+7,根据规律(++号优先级大于+号,++号自右向左,+号自左向右)
~首先在Code::Blocks 17.12编译器中(++j)+(++j),
~系统是这样看待的{(++j)+(++j)},
(i++)+(i++)=5+1+1+5+1+1,具体怎么运算的看汇编,后面会帮你总结这一特性规律关于i++,i++,++i,++i,关于编译器是Code::Blocks 17.12的同学,这个地方比较特殊,这个是++i的你编译器的一个特性。
~然后+号优先级数低于++号,先算++号的,由于+号的约束,就是前两个在{ }内,前两个先加一后再继续运算,所以在{ }内先进行++的运算,两个彼此影响,都要加5+1+1+5+1+1,7+7,14,{(++j)+(++j)}。
~而q={{(++j)+(++j)}+(++j);}相当于{14+(++j)}=14,{(++j)+(++j)}已经变成14了,无法影响同{ }内(++j),所以q=(++j)+(++j)+(++j)=22=7+7+8。
·~至于为什么与别的编译器不一样,多试验你就明白了,这些要看汇编语言怎么表示,我这样描述不太准确,但确实是这个规律。
第四次p=26,q=31,i=9,j=9:
p=(i++)+(i++)+(i++)+(i++)=5+6+7+8=26
q=(++j)+(++j)+(++j)+(++j)=7+7+8+9=31
第五次p=35,q=41,i=10,j=10:
p=(i++)+(i++)+(i++)+(i++)+(i++)=5+6+7+8+9=35
q=(++j)+(++j)+(++j)+(++j)+(++j)=7+7+8+9+10=41
第六次p=45,q=52,,i=11,j=11:
p=(i++)+(i++)+(i++)+(i++)+(i++)+(i++)=5+6+7+8+9+10=45
q=(++j)+(++j)+(++j)+(++j)+(++j)+(++j)=7+7+8+9+10+11=52
看到这相信你懂大致的规律了可具体怎么运算的呢?
用Code::Blocks 17.12的规律讲:
++i与–i不论什么位置,都受++i,–i,i++,i–的影响,都是加一完后运算后打印出来。
而 i++,i–也是不论什么位置,都只受右边++i,–i,i++,i–的影响。
不同的是,请看下面第二张图片:
printf("%d,%d,%d,%d,%d,%d",i++,i++,++i,++i);,为什么打印出来的是3,2,4,4。明明原理都一样。
i++,i–是先运算再加一,所以先打印出运算了的,显示结果,是i++,i++,++i,++i中从左到右第二个i++运算的的是,++i,++i,第三第四的加一等于2,打印出来所以值为2,i++,i–是先运算再加一,所以运算继续,第二个打印完后,值继续运算加一了传给第一个i++所以值为3,此时先把运算结果3打印出来,但是加一还要继续,得4,但不打印,所以值为3,2,4,4。
第一张图片
在这里插入图片描述
第二张图片
在这里插入图片描述
第三张图片
在这里插入图片描述
第四张图片
在这里插入图片描述
第五张图片
在这里插入图片描述
第六张图片
在这里插入图片描述
第七张图片
在这里插入图片描述
第八张图片
在这里插入图片描述
第九张图片
在这里插入图片描述

     没有+号约束的情况下
     i++先打印出右边运算完的,然后在带进自己里面加一,得出结果
     (第九张图片,第一个i++结果本是0,但是打印的是-1,说明打印出的运算结果是上一步的运算结果,
     最终结果仍会继续运算出0,但不打印出来,打印最终结果0前的上一步运算结果-1,所以-1打印出来)
     先打印,后加一,从右向左运算。
     ++i,不用想那么多看整体,全部加完后得到结果再打印出来

看到这相信你对i值的变化规律有掌握了,如果有什么错误希望帮忙指出,第一次写这种文章感觉好多地方做的不到位请见谅**

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值