探讨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

posted @ 2013-03-19 02:10  java程序员填空  阅读(112)  评论(0编辑  收藏  举报