A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我能学编程吗 中级黑马   /  2013-10-31 22:53  /  1061 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 我能学编程吗 于 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++,因为之前的帖子就是这个问题,如下:
  1.         public static void main(String[] args) {
  2.                 int i = 0;
  3.                 for (int k = 0; k < 3; k++) {
  4.                         i = i++;
  5.                 }
  6.                 System.out.println("i = " + i);// 结果为0
  7.                
  8.                 i = 0;
  9.                 for (int k = 0; k < 3; k++) {
  10.                         i = ++i;
  11.                 }
  12.                 System.out.println("i = " + i);// 结果为3
  13.         }
复制代码
把上面的原理拿下来: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++返回的是没自加之前的值,原理如下:
  1.         /** i++ 原理 */
  2.         public static int iJJ(int i) {
  3.                 int temp = i;
  4.                 i = i + 1;
  5.                 return temp;
  6.         }
  7.         
  8.         /** ++i 原理 */
  9.         public static int JJi(int i) {
  10.                 i = i + 1;
  11.                 return i;
  12.         }
复制代码
注:上面只是原理演示,大家可千万别较真说通过方法传参是改变不了方法外的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;
再一次最后,给大家一个例子,猜猜结果是什么?
  1.                 int i = 0;
  2.                 int n = 0;
  3.                 for (int k = 0; k < 3; k++) {
  4.                         n = i++;
  5.                 }
  6.                 System.out.println("i = " + i);
  7.                 System.out.println("n = " + n);
复制代码
下面是正确答案,看看你猜对了吗?如果没对,可以再看看上面的原理:
i = 3
n = 2

觉得有学到东西的朋友们顶一下帖子,谢谢!!



评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 小伙伴都长姿势了~

查看全部评分

4 个回复

倒序浏览
我觉得楼主说的有道理,以前的认识可能还真是有些偏差,必须顶一个!
回复 使用道具 举报
弱弱的问一句,这个有什么意义么,i=i++ 这个语句有什么应用的价值呢
回复 使用道具 举报
零下五度的水 发表于 2013-11-1 01:52
弱弱的问一句,这个有什么意义么,i=i++ 这个语句有什么应用的价值呢

可以说没有任何的意义,不过此处用来作演示i++原理的例子还是不错的。
回复 使用道具 举报
i=1;
i++,i和i++表达式都是2。
++i,i是2,表达式++i是1.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马