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结束前一定会执行的代码放置的地方