前言
对于学高级程序设计语言的同学来说,i++和++i这个是最基础的知识,i++不就是先运算再++吗,++i不就是先++再运算吗?结果确实是怎样的,但是呢,底层是如何实现的呢?这个似乎好像不知道哦,接下来就以Java为例来讲解i++与++i的底层秘密。
热身
观察下面的面试题代码,看看运行的结果是啥呢?
public class Test {
public static void main(String[] args) {
fun1();
fun2();
}
public static void fun1() {
int a=15;
a=a + a++;
System.err.println(a);//30
}
public static void fun2() {
int a=15;
a=a + ++a;
System.err.println(a); //31
}
}
可能有些小伙伴对输出的结果有点疑问,没事的,运行出来的结果确实是如此的。所以,我们决定康康一
一下结果为啥是这样的。
- 首先研究一下fun1()函数
经过反编译出的源码如下:
public static void fun1();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=0
0: bipush 15 //将15push到栈中
2: istore_0 // 将15保存到局部变量表0位置中
3: iload_0 //将局部变量表0位置的值(15)加载到栈中
4: iload_0 //将局部变量表0位置的值(15)加载到栈中,此时栈中有15,15两个值
5: iinc 0, 1 //将0位置局部变量表中的值增加1,此时局部变量表中的值为16
8: iadd //将栈中的值进行相加15+15=30
9: istore_0 //然后将30存放到0位置的局部变量表中,也就是最后执行的值30
10: getstatic #3 // Field java/lang/System.err:Ljava/io/PrintStream;
13: iload_0
14: invokevirtual #4 // Method java/io/PrintStream.println:(I)V
17: return
LineNumberTable:
line 8: 0
line 9: 3
line 10: 10
line 11: 17
- fun2()函数
public static void fun2();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=0
0: bipush 15 //将15加载到栈中
2: istore_0 //栈中pop到0位置的局部变量表中
3: iload_0 //再将0位置局部变量的值加入到栈中 15
4: iinc 0, 1 //0位置局部变量的值增加1,此时局部变量值为16
7: iload_0 //再将0位置的值加载到栈中,此时栈中为 16,15
8: iadd //16+15=31
9: istore_0 //存储到0位置中 答案就是31
10: getstatic #3 // Field java/lang/System.err:Ljava/io/PrintStream;
13: iload_0
14: invokevirtual #4 // Method java/io/PrintStream.println:(I)V
17: return
LineNumberTable:
line 14: 0
line 15: 3
line 16: 10
line 17: 17
}
常见面试题
public static void fun3() {
int a=15;
a=++a + ++a;
System.err.println(a);//33
}
public static void fun4() {
int a=15;
a=++a + a++;
System.err.println(a);//32
}
public static void fun5() {
int a=15;
a=a++ + ++a;
System.err.println(a);//32
}
public static void fun6() {
int a=15;
a=a++ + a++;
System.err.println(a);//31
}
今天分享到此结束了,有问题可以评论区留言哦!!!