java中关于a++跟++a的操做运算解释

昨天,在群里被一我的问了一段代码,代码以下: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

 

PS:首先,引入腿毛知乎的一小段代码(版权费已经给腿毛了,,虽然只有1.11),我就不写了,太麻烦,有兴趣的同窗能够本身经过 javap -c XX.class 查看运行指令

 

先看下面这段代码(下面全部指令都是经过查看class文件后获得的,有兴趣的同窗,能够本身查看)code

int a = 789;
int b;
b = a++;

 

  1. sipush 789 // 把一个789放入栈顶
  2. istore_1 // 把这个789存给a
  3. iload_1 // 把a放到栈顶,栈顶就是789了
  4. iinc 1, 1 // 把a加一,a就是790了
  5. istore_2 // 把栈顶的数存给b,b变成了789

而后,咱们改下上面的代码blog

int a = 789;
int b;
b = ++a;
  1. sipush 789 // 把一个789放入栈顶
  2. istore_1 // 把这个789存给a
  3. iinc 1, 1 // 把a加一,a就是790了
  4. iload_1 // 把a放到栈顶,栈顶就是790了
  5. 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

 

  1. iconst_1          // 数值1放入栈顶
  2. istore_1          // 把1存给a
  3. iload_1           // 把a放到栈顶,栈顶有1了
  4. iinc          1, 1 //把a加一,a就是2了
  5. iload_1          //把a放到栈顶,栈顶有2了
  6. iadd             //栈顶两int型数值相加,栈顶就是3了
  7. iinc        1, 1 //把a加一,a就是3了
  8. iload_1        //把a放到栈顶,栈顶就是3了
  9. iadd           //栈顶两int型数值相加,栈顶就是6了
  10. 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(里面有基佬,有萌萌,有大牛...)

欢迎你们入坑!!

 

以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正

欢迎转载,请注明出处跟做者,谢谢!

相关文章
相关标签/搜索