黑马程序员技术交流社区
标题:
i++与++i原理--索求两个技术分
[打印本页]
作者:
我能学编程吗
时间:
2013-10-31 22:53
标题:
i++与++i原理--索求两个技术分
本帖最后由 我能学编程吗 于 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
觉得有学到东西的朋友们顶一下帖子,谢谢!!
作者:
熊猫86
时间:
2013-11-1 00:39
我觉得楼主说的有道理,以前的认识可能还真是有些偏差,必须顶一个!
作者:
零下五度的水
时间:
2013-11-1 01:52
弱弱的问一句,这个有什么意义么,i=i++ 这个语句有什么应用的价值呢
作者:
我能学编程吗
时间:
2013-11-1 03:02
零下五度的水 发表于 2013-11-1 01:52
弱弱的问一句,这个有什么意义么,i=i++ 这个语句有什么应用的价值呢
可以说没有任何的意义,不过此处用来作演示i++原理的例子还是不错的。
作者:
ciowok
时间:
2013-11-1 11:35
i=1;
i++,i和i++表达式都是2。
++i,i是2,表达式++i是1.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2