本帖最后由 我能学编程吗 于 2013-11-1 03:00 编辑
这是一个关于i++和++i原理的问题。
曾经有个帖子,有人提问了,各种回复,我觉得都不太好,我觉得上次自己回答的虽然也不太好,但是也应该能给个技术分的:http://bbs.itheima.com/forum.php?mod=redirect&goto=findpost&ptid=91401&pid=514625
最近看到了一本书,了解了原理,现共享出来,看之前帖子的回答,没人理解的透,不然几下就能说明白原因,我估计这个原理很多人都不理解,所以这里共享后,希望版主能给两个技术分,因为这个是大多数人不了解的,如:
k = i++; // 一般人认为是:先把i的值赋值给k,然后i再自加,千篇一律说的都是这句。 严格来说,这种理解是不够正确的,应该是:i先自加,然后再把i自加前的值赋值给k
k = ++i;// i先自加,然后再把自加后的结果赋值给k
这里我主要说的是i++,因为之前的帖子就是这个问题,如下:- public static void main(String[] args) {
- int i = 0;
- for (int k = 0; k < 3; k++) {
- i = i++;
- }
- System.out.println("i = " + i);// 结果为0
-
- i = 0;
- for (int k = 0; k < 3; k++) {
- i = ++i;
- }
- System.out.println("i = " + i);// 结果为3
- }
复制代码 把上面的原理拿下来:k = i++; // 一般人认为是:先把i的值赋值给k,然后i再自加,千篇一律说的都是这句。
那么 i = i++;按着多数人的理解是:先赋值,后自加,即:
1、先赋值:i = i; 即 i = 0
2、后自加:i = i + 1,即i = 0 + 1 ,即 i = 1,即 i 最终的值为1。但是实际上并不是。
根据大多数人的理解的话,i = i++;这个表达式是可以实现自加的。
然后,i++真正的原理并不是"先赋值后自加",它跟++i一样,都是先自加,后赋值的,只是i++返回的是没自加之前的值,原理如下:- /** i++ 原理 */
- public static int iJJ(int i) {
- int temp = i;
- i = i + 1;
- return temp;
- }
-
- /** ++i 原理 */
- public static int JJi(int i) {
- i = i + 1;
- return i;
- }
复制代码 注:上面只是原理演示,大家可千万别较真说通过方法传参是改变不了方法外的i,这只是为了方便理解而写成方法,大家就假设它是能改变的:
i = i++; 就相当于:i = iJJ(i); 注:这里是调用了上面的iJJ(int i)方法, 这样大家就可以知道为什么上面的结果是0了
i = ++i; 就相当于:i = JJi(i); 注:这里是调用了上面的JJi(int i)方法, 这样大家就可以知道为什么i = i++ 不能实现自增,而j = ++j;就可以了,
好了,看了原理,是不是以后遇到类型的先++和后++的问题,把原理拿出来一看就知道了。
好了,最后,再强调一下,希望给两个技术分,因为这个原理够简单明了吧?而且上次的也没给我分呢,把我上次在别人处的经典回答再拿过来强调下:
虽然上面原理知道了,也知道了:
i = i++不能实现自增
i = ++i能实现自增
上次别人的都回答都是说要把i = i++ 改成i = ++i,而我上次的回答是:
上面两种写法都不可取(即便j = ++j可以实现自增),正确的自增应该使用下面的方式之一:
1、i = i + 1;
2、i++; 或 ++i;
3、i += 1;
再一次最后,给大家一个例子,猜猜结果是什么?- int i = 0;
- int n = 0;
- for (int k = 0; k < 3; k++) {
- n = i++;
- }
- System.out.println("i = " + i);
- System.out.println("n = " + n);
复制代码 下面是正确答案,看看你猜对了吗?如果没对,可以再看看上面的原理:
i = 3
n = 2
觉得有学到东西的朋友们顶一下帖子,谢谢!!
|