i++与++i

i++与++i之间的区别


本文是我个人理解之作,如有分析不对的地方,请指出

i++与++i之间的区别

之前面试的时候,只知道i++是先复制,后做自增运算,++i 是先自增后赋值,看完本篇文章就知道其中区别

i++ :i= i; i= i+1;
++i :i= i+1;i= i;
这是做自增或者自减的操作步骤,但是底层执行与上写是不一样的,且优先级来说 ++ 优先与四则运算(= - * /)
像要了解两者的却别,需要先了解jvm底层关于其操作

在这里插入图片描述
我们的方法实在栈中进行的,栈的规则就是“先进后出的”,每个方法进栈都会有一个栈帧,每个栈帧都会有局部变量表、操作数栈、动态连接和方法出口,
局部变量表:局部变量值改变
操作数栈:赋值等操作
动态链接:调用其他方法
方法出口:返回值

现在有这样一个面试题
下面展示一些 内联代码片

public static void mian(String[] args){
int i = 1 ; 
 i = i++ ; 
 int j = i++; 
 int k = i+ ++i * i++;
 system.out.print("i = "+ i);
 system.out.print("j = "+ j);
 system.out.print("k = "+ k);
}

第一次看到这个题,觉得so easy 啊,然后一顿猛操做,得出结果,还在沾沾自喜,然后通过运行代码后,发现自己错的离谱,现在还原一下当时的分析

public static void mian(String[] args){
int i = 1 ; 
 i = i++ ;  // i= 1 ; = = i++; =》 i = 2;
 int j = i++; // j = i ; i = i+1  =》 j = 2 ; i = 3
 int k = i+ ++i * i++; // k = 3 + 4 * 5 = 23 
 system.out.print("i = "+ i);
 system.out.print("j = "+ j);
 system.out.print("k = "+ k);
}

但是运行的结果是这个样子的

i = 4
j = 1 
k = 11

那么为什么呢?接下来我们就开分析一下

//第一步
i = i++ ;

如图分析步骤一
在这里插入图片描述

//第二步
j = i++ ;

如图分析步骤二
在这里插入图片描述

//第三步
k = i + ++i + i++

如图分析步骤三

在这里插入图片描述

如此这般分析完了,终于知道为什么第一次i = i++最后 i= 1

最后来一个我真实面试时,我做的面试题,这里不仅涉及到i++ 和++ i的知识点,还涉及到try catch finally 知识

//第三步
public int getI(){
int i = 1
try{
return i++;
}catch(exception e){
}finally{
return ++i;
}
}

公布结果拉啦

3

解析

1.return i++  此时 return 2,将2 放到返回出口的域中,
2.finally 中的return ++i  此时 return 3, 也将3 放到返回出口域,则3 替代了 2 ,则返回的是3,
finally语句是try catch结束前一定会执行的代码放置的地方 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值