a++ &#60&#60 ++a + ++a = ?

前言

最近看到别人去面试的经验,看到有这么一道题:

int a = 2;
int b = a++ << ++a + ++a;
System.out.println(b);

我觉得很有意思,因为我相信很多小伙伴和我一样毕业多年,早就不记得a++和++a的区别了。或者很多小伙伴去面试时也可能遇到这样类似的面试题。

正文

我觉得应该很多人会因为标题而点进来,或许有的人只想验证一下自己的答案,有的人或许想知道原理。不管怎么样都好,我一次性满足你们所有的愿望。
首先,答案是:a++ << ++a + ++a = 1024

好了,这里可以有一部分人退场了,所以。。。。

*********************************此处应有分割线=======================================

接下来,准备讲解一下原理,但是得先补充一下基本知识
首先,2++ = 3,++2 = 3,所以++在java里表示+1的意思;
其次,<< 表示左移移,不分正负数,低位补0;
然后,还得引入二进制的概念:二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。简单点说,每一位代表则2的次幂,且1为有,0为无。

左移的小例子
在这里插入图片描述

好了,前戏演完了,开始正式进入重头戏
首先,了解Java的两个规则:
1.位运算优先级低于逻辑运算,其次a++运算时值不会变,但a值会变
2.自增优先级最高,加法其次,最后是按位移

这两个规则,结合上这一道题目,我们应该怎么理解呢?
1. a++步骤可以看成把a赋给一个临时变量temp=a去运算,当运算结果完成后再把a的实际值自增
2. ++a步骤则是a=a+1,优先进行了+1后再去运算

所以
a++ << ++a + ++a
= a << ((a+1)+1) + (((a+1)+1)+1)
= 2 << 4 + 5
= 2 << 9
= 2的10次方
= 1024

在这里插入图片描述

这里大家可以慢慢消化一下,然后做下面这一道题:

        int a = 2;
        int b = a++ + --a << ++a + a-- << a << ++a + --a;
        System.out.println(b);

这里大家先别看答案,看看能不能解出来,如果解出来了,说明你理解了;解不出来可以参考答案加深理解。
*************************************************************************************分割线
*************************************************************************************又来了
好了,开始解题
a++ + --a << ++a + a-- << a << ++a + --a
= a + ((a+1)-1) << (((a+1)-1)+1) + (((a+1)-1)+1) << ((((a+1)-1)+1)-1) << (((((a+1)-1)+1)-1)+1) + ((((((a+1)-1)+1)-1)+1)-1)
= 2 + 2 << 3 + 3 << 2 << 3 + 2
= 4 << 6 << 2 << 5
= 2 << 1 << 6 << 2 << 5
= 2 << 14
= 32768

这里,我将4变成了2 << 1 这样比较好算 2的次幂,也容易理解。
在这里插入图片描述

好了,今天就讲到这了,不知道你们理解没有?如果没有理解,可以再读几次,或者过一段时间再过来读。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值