阿里大佬如何解决,java中i=i++问题解析,你学废啦嘛

今天在班里学了自增操作,先看一个简单的案例:

public class Test{
	public static void main(String[] args){
		int a=10;
		int m=7+a++;// m=7+a   a=a+1
		System.out.println(a);//11
                System.out.println(m);//17
	}
}

i++或者++i参与到运算中的时候,有个特定的规律:

i++ : 先运算,后加1

++i : 先加1,后运算

所以上面的题,int m=7+a++;

计算过程:(1)先计算 m=7+a (2)再计算: a=a+1

所以最后结果 a=11 m=17


上面的就是个常规题,你要是上面的都没看懂 ,那么下面的也不用看了。。。。

今天上课有个学生问我 :i=i++ 为啥不遵照上面的规律 ???

先看一个代码:

public class Test{
	public static void main(String[] args){
		int a=10;
		int varNum=66;
		varNum=varNum++;
		System.out.println(varNum);
	}
}

按照上面的道理,varNum经过 varNum=varNum++操作后 ,应该变为 67,

但是实际结果,发现varNum的值 还是66:

阿里大佬如何解决,java中i=i++问题解析,学到了

 

????为什么?

在讲解原因之前,先学习一些预备知识:

(1)栈

阿里大佬如何解决,java中i=i++问题解析,学到了

 

栈最上面是栈顶,下面是栈底 。。

局部变量的值,在内存分析的时候,都被放入了栈中,栈的特点是先进后出,意味着先放进去的数,会被放在下面,后进去的数,一个一个垒在上面(就像往筒中放乒乓球)

(2)虚拟机指令---假如看不懂,可以先略过这部分往下看,然后回头再回来看~~~

要铺垫一些简单的虚拟机指令:(以下截图都是我从百度找的)

第一个:bipush

阿里大佬如何解决,java中i=i++问题解析,学到了

 

第二个:istore_1

阿里大佬如何解决,java中i=i++问题解析,学到了

 

第三个:iload_1

阿里大佬如何解决,java中i=i++问题解析,学到了

 

第四个:iinc

阿里大佬如何解决,java中i=i++问题解析,学到了

 

上面的两个技能点,是两个铺垫技能点,下面开始讲解 varNum=varNum++运算:

首先先介绍一个JDK自带的反编译工具: 一个命令 javap 可以看到到底底层是怎么执行上面的代码的!

首先先编译Demo.java文件:

阿里大佬如何解决,java中i=i++问题解析,学到了

 

此时已经在我电脑的D盘train2018文件夹下 生成了Demo.class文件!

然后执行javap命令:

阿里大佬如何解决,java中i=i++问题解析,学到了

 

上面图中,红色部分,就是底层 varNum=varNum++的执行过程:

那么通过下面的解释,结合上面铺垫的虚拟机指令,来讲解红色框部分:

0: bipush 10 将参数10压入栈;

2: istore_1 栈中弹出一个数,赋给第一个局部变量:a

3: bipush 66 将参数66压入栈;

5: istore_2 栈中弹出一个数,赋给第二个局部变量:varNum

6: iload_2 将第二个局部变量varNum的值入栈,此时栈顶的值为66

7: iinc 2, 1 指令iinc对给定的局部变量做自增操作

2, 1 表示对第2个局部变量varNum进行累加1操作 ,意味着

varNum 变为了 67

10: istore_2 栈顶弹出一个数:也就是66 赋给第二个局部变量 varNum

意味这 varNum的值 又变回66了。。白忙活了

 

最终打印结果 就是: 66

阿里大佬如何解决,java中i=i++问题解析,学到了

 

over~~~~

 

对评论的几个意见做个解释:

1.为什么名字我起成了varNum而不是i

因为虚拟机指令例如istore_1

我不想让你误会那个指令中的i是变量名字i

2.为什么给了一个值66

同上个原因 ,就是为了不让你误会istore_1的1是变量值

3.对于评论中说这玩意工作用不到的

工作中谁这样写,多半是脑子有泡

我讲的目的是为了面试 ,是为了给需要这个问题的人看

4.为啥要写这玩意 因为上面说了有学生问!

讲到这里,给大家推荐小编通过一些大厂的朋友要到了他们内部的Java面试题,资料难得,而且还是近一年的真实面试题;

分别有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

阿里大佬如何解决,java中i=i++问题解析,学到了

 

小编网盘也通过这些年的积累,把Java电子书也分享给大家,大概有10G左右的资源

阿里大佬如何解决,java中i=i++问题解析,学到了

 

阿里大佬如何解决,java中i=i++问题解析,学到了

 

珍藏多年的高端简历模板,也一起送给大家

阿里大佬如何解决,java中i=i++问题解析,学到了

 

资料免费领取步骤

1、关注,转发

2、私信发送:资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值