概述
面试官:“你知道i++和++i的区别吗?”
我:“不好意思,这个我不太清楚”。、
面试官:“好吧,那我们有消息再通知你”。
OK。以上就是我刚毕业出去面试的时候我们被老板问到问题,和我的回答。当然最后并没有被通知。
所以今天我们就来详细的看一下i++和++i到底有什么区别?原理是什么?好了。我们开始吧。
初见i++和++i
相信初学java的同学并不会在意i++和++i有什么区别。应该都是觉得是本身加1。(起码我自己初期是这样)我们看下下面的两个代码。大家可以思考一下两个结果都输出了什么结果。
public class ippAndppi {
public static void main(String[] a) {
ipp();
ppi();
}
public static void ipp() {
int i = 0;
int k = i++;
System.out.println("k=" + k);
}
public static void ppi() {
int i = 0;
int j = ++i;
System.out.println("j=" + j);
}
}
**正确答案是 **
为什么++i和i++结果不一致。我们首先来讲一下i++和++i的区别。
i++和++i区别
i++ 和 ++i 在理论上的区别是:
i++:是先把i拿出来使用,然后再+1;
++i :是先把i+1,然后再拿出来使用;
可能有的同学感觉比较抽象,似懂非懂。那我给大家举一个小例子。大家就明白了。
比如我们做一盘菜。然后呢感觉有点甜。想要加点盐。那么
i++就是先尝一口然后再放盐。那尝起来发现味道没变。
++i就是先放盐然后再尝一口。发现变咸了。
这样讲的话大家应该就好懂一点了。那为什么会这样呢?
原理
要探究出来原理。我们可以看下编译后的源码。
首先先看下i++的
源码
public static void ipp() {
int i = 0;
int k = i++;
System.out.println("k=" + k);//k=0
}
这是编译之后的
public static void ipp();
Code:
0: iconst_0 // 将int型(0)推送至栈顶
1: istore_0 // 将栈顶int型数值存入第2个本地变量 (i) 此时 i=0
2: iload_0 // 将第一个int型本地变量(i)推送至栈顶 此时i=0
3: iinc 0, 1// 本地变量i自增
6: istore_1 // 将栈顶int型数值存入第2个本地变量 (k)此是k=0
7: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
10: new #5 // class java/lang/StringBuilder
示意图
再来看下++i的
源码
public static void ppi() {
int i = 0;
int j = ++i;
System.out.println("j=" + j);
}
编译之后
public static void ppi();
Code:
0: iconst_0 // 将int型(0)推送至栈顶
1: istore_0 // 将栈顶int型数值存入第2个本地变量 (i) 此时
2: iinc 0, 1// 本地变量i自增 此时i=1
5: iload_0 // 将第一个int型本地变量(i)推送至栈顶 此时i=0
6: istore_1 // 将栈顶int型数值存入第2个本地变量 (k)此是k=0
7: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
示意图
根据上面两个我们可以看到i++和++i的区别主要是
i++先自增然后再赋值
++i是先赋值再自增
学完上面的基础之后大家可以试着想一下下面这两个的输出。
public static void ipp100(){
int i=0;
for(int x=0;x<100;x++){
i=i++;
}
System.out.println("i=" + i);
}
public static void ppi100(){
int j=0;
for(int x=0;x<100;x++){
j=++j;
}
System.out.println("j=" + j);
}
答案是
好了。以上就是i++和++i的区别、以及原理。如果有什么问题,希望大家评论见。谢谢