多个自加,++引发的深入理解

虽然这个讨论没什么卵用,但好奇心的驱使,如果你也和我一样,那就往下看吧。

为了方便我在这int a=3,b1,b2,b3,b4;主要观察b的输出来判断我们的想法是否正确

思考:

b1=(a++)+(a++);

b2=(a++)+(++a);

b3=(++a)+(++a);

b4=(++a)+(a++);

依据我们比较普遍的准则:a++先用后加(这加是什么时候加?再次调用加,还是这一行命令结束后?),++a先加后用

a++先用命令结束后加:

b1=3+3=6,b2=3+4=7,b3=4+5=9,b4=4+4=8

a++先用再次调用加:

b1=3+4=7,b2=3+5=8,b3=4+5=9,b4=4+4=8

看了这两行,是不是已经蒙了,我以为a++是先用后加,++a是先加后用已经没有bug了,可现在看来只是没有遇到而已,不多说了,直接给答案:

b1=6,b2=8,b3=10,b4=8

貌似两次答案都能对个百分之五十,可我们应该尽自己可能去把握已知的,所以让我们深入理解它

为了更好的理解,我对应的写出上面简单的过程,希望有帮助b1=3+3,b2=4+4,b3=5+5,b4=4+4

我先不解释,继续来看int b5=(++a)+(++a)+(++a)+(++a);

这时b5的值是多少呢?b5=7+7+7+7=28?

正确答案是b5=23,a=7。

这里真实的运算规则是

由于加法运算符“+”是二元运算符,所以每次运算都只需要2个操作数,运算后结果保存在一个缓存变量ans中。

所以先运算(++a)+(++a),则结果为ans=5+5=10,a=5;

然后再运算ans+(++a),则结果为ans=10+6=16,a=6;

然后再运算ans+(++a),则结果为ans=16+7=23,a=7;

然后赋值b5=ans=23;

看到这里明白了吧,其实结合逆波兰表达式的堆栈求解方法很容易理解这个问题。

不要误以为b5=(++a)+(++a)+(++a)+(++a)就是单纯运算4次自加后,a和a之间的加法

理解了这个加上之前知道的a++先用后加(行命令结束后可以自行测试,简单的讲就是:忽略所有的i++操作符,先进行运算,等表达式的值求解完成后,才对相应的变量进行自加。),++a先加后用就可以来做一下下面这道题了

int a=3;

int b0=(a++)+(++a)+(a*10);

没错就是 4+4+40=48

最后自减“--”也是同样,如果功力深厚,可以考虑看汇编代码,更好的知道语言运算的机制。

下面是我公众号,希望有更多有趣的朋友来

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值