探讨i++跟++i
通常的理解:
Java中,提起i++就知道是先赋值后自增,提起++i就知道是先自增后赋值,那么来看下面一段程序:
public class Demo{ public static void main(String[] args) { int x = 0; for (int y = 0; y < 5; y++) { x = x++; System.out.println("x=" + x); } /* 控制台输出结果: x=0 x=0 x=0 x=0 x=0 */ } }
问题的引出:
为何输出结果都是0?变量x自加了吗?看到这最好自己思考一下。
x=x++; 这条语句按照先赋值后自增思路是,先把x赋值给x,x等于0,然后x=x+1,x等于1?但前边已经做了赋值运算了,后面的算怎么回事?与x无关吗?
问题的分析:
i++,++i其实是一个依赖于Java里面的“中间缓存变量机制”来实现的。
比如 i = j++
temp = j; // 先赋值给中间缓存变量 j = j + 1;// 后自加 i = temp;再比如 i = ++j
j = j + 1;// 先自加 temp = j; // 后赋值给中间缓存变量 i = temp;
那么在以上程序中,x=x++; 进入循环:
temp=x; // 先赋值 x = x + 1; // 后自加 x = temp; // temp现在等于0,那赋值完毕后,x等于0。赋值完毕,temp内存释放。
循环5次结束后,执行了5次上面的代码,所以输出5次0。
而如果是x=++x,程序就不会出现上面的情况,如下:
x = x + 1; // 先自加 temp = x; // 后赋值给中间缓存变量 x = temp; /* 控制台输出: x=1 x=2 x=3 x=4 x=5 */
为了加强对i++,++i的理解,再来分析一段小程序:
// 程序演示示例: int i = 10; i = i++ + i++; // 拆分:temp1=i(10)、i=i+1(11)、temp2=i(11)、i=i+1(12)、i = temp1(10)+temp2(11) System.out.println(i); // 输出21 i = ++i + ++i; // 拆分:i=i+1(22)、temp1=i(22)、i=i+1(23)、temp2=i(23)、i = temp1(22)+temp2(23) System.out.println(i); // 输出45
总结:
i++,++i是一个依赖于Java里面的“中间缓存变量机制”来实现的。
原创文章,转载请注明出处:http://blog.csdn.net/thinking_in_android