昨天,在群里被一我的问了一段代码,代码以下:java
int a = 1; int b; b = a+(++a)+(++a); System.out.println(b);你们猜猜打印结果是多少,我开始猜的打印结果是9,贴上代码后,才发现,打印结果是6,而后我就很纳闷,怎么是6?查看了一下class文件,而后问了下"腿毛",而后就知道了.下面进入正文吧测试
----------------------------------分割线---------------------------------------spa
咱们都知道,a++跟++a分别是不一样的操做,前者是先运算,后自增,后者是先自增,后运算,若是遇到了以下代码:a+(++a)+(++a),运算过程是怎么样呢,先让咱们看最简单的.net
先看下面这段代码(下面全部指令都是经过查看class文件后获得的,有兴趣的同窗,能够本身查看)code
int a = 789; int b; b = a++;
- sipush 789 // 把一个789放入栈顶
- istore_1 // 把这个789存给a
- iload_1 // 把a放到栈顶,栈顶就是789了
- iinc 1, 1 // 把a加一,a就是790了
- istore_2 // 把栈顶的数存给b,b变成了789
而后,咱们改下上面的代码blog
int a = 789; int b; b = ++a;
- sipush 789 // 把一个789放入栈顶
- istore_1 // 把这个789存给a
- iinc 1, 1 // 把a加一,a就是790了
- iload_1 // 把a放到栈顶,栈顶就是790了
- istore_2 // 把栈顶的数存给b,b变成了790
也就中间两条指令顺序变了,其余的没有区别ip
好了,下面是重头戏了,贴上文章开头的代码(用红色表示这是我本身的代码...)内存
int a = 1; int b; b = a+(++a)+(++a); System.out.println(a); //输出结果是3 System.out.println(b); //输出结果是6
- iconst_1 // 数值1放入栈顶
- istore_1 // 把1存给a
- iload_1 // 把a放到栈顶,栈顶有1了
- iinc 1, 1 //把a加一,a就是2了
- iload_1 //把a放到栈顶,栈顶有2了
- iadd //栈顶两int型数值相加,栈顶就是3了
- iinc 1, 1 //把a加一,a就是3了
- iload_1 //把a放到栈顶,栈顶就是3了
- iadd //栈顶两int型数值相加,栈顶就是6了
- istore_2 //把6给b,完成运算
----------------------------------分割线---------------------------------------get
PS:a+(++a)+(++a) 运算过程白话版:
1. a初始化1,入栈顶
2.(++a)运算,a=2,参与内存运算
3.(++a)运算 a=3,参与内存运算
4. 计算:1+2+3
得到结果,而且赋值
也就是,参与运算的,并非a自己,而是a的值...经过指令的调用,a的值每次到栈顶都不同,a第一次入栈顶的时候是1,第二次入栈顶++a,就是2了,并且a的值会变为2,第三次入栈顶++a,就是3了,并且a的值会变为3,栈顶数值相加就是 1+2+3,可能有人会问,若是这样,应该是3个a相加,可是实际不是的,参与运算的是a的值,不是a自己,每次入栈顶,a的值都会变化,因此就会形成理解的偏差,最后在说一句:java运算参与,是变量值的运算,而不是变量自己博客
以上..在加一个,若是要查看指令,能够到下面这博客查看:http://blog.csdn.net/lm2302293/article/details/6713147
完结,写完,收工!
插入我的广告:Python交流群,扫描二维码进入
吾爱java交流群号:170936712(里面有基佬,有萌萌,有大牛...)
欢迎你们入坑!!
以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正
欢迎转载,请注明出处跟做者,谢谢!