int i = 0;i = i++;System.out.println(i);produces the output "0" instead of "1". Why?
Let's take a close look at what the line "i = i++;" does:
- "i++" is evaluated. The value of "i++" is the value of i before the increment happens.
- As part of the evaluation of "i++", i is incremented by one. Now i has the value of 1;
- The assignment is executed. i is assigned the value of "i++", which is the value of i before the increment - that is, 0.
That is, "i = i++" roughly translates to
int oldValue = i; i = i + 1;i = oldValue;
With other words, it is a common misconception that the increment is happening last. The increment is executed immediately when the expression gets evaluated, and the value before the increment is remembered for future use inside the same statement.
Solution:
You don't need the assignment at all, just use
i++;
-----------------------------------------------------------------------------------------------------
i++与++i的区别
如果是单独成行,两个没有本质区别(for循环中也是单独成行):++i; i++; 两个效果一样。只有当你和其
他运算联用的时候才有区别,比方赋值: x=i++ 和 x=++i是不一样的,区别自己用心理会。
例如:
i=6,x=0
x=i++ 就是先把i=6的值,赋值给x。然后i再++等于7,x=6。
x=++i 就是i先自己加1,然后再赋值给x。x和i都等于7。
把i++和++i语句分解如下:
++i 和 i++,在单独使用时,就是 i=i+1。
而 a = ++i,相当于 i=i+1; a = i;
而 a = i++,相当于 a = i; i=i+1;
所以---
a=++i完全可以写成 i++; a=i。
a=i++完全可以写成 a=i; i++。
简而言之---
++i 是先++在做后面的运算。
i++ 是先做后面的运算再加(运算完后i才++)。++i 先自加再使用(用的时候已经是原值+1了);i++先使用再自加!
此上中文部分有待考虑。
最好的解释:
学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试:
JAVA:
public class test
{
public static void main(String args[])
{
inti,j;
i=0;
for(j=0;j<5;j++)
{
i=i++;
System.out.println("i="+i);
}
}
}
C:
#include<stdio.h>
main()
{
inti,j;
i=0;
for(j=0;j<5;j++)
{
i=i++;
printf("i=%d/n",i);
}
}
你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。
第一个JAVA程序得出的结果如下:
i=0
i=0 www@bitscn@com
i=0
i=0
i=0
而第二个C程序得出的结果如下:
i=1
i=2
i=3
i=4
i=5
同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:
i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
明白了上面的问题,让我们接下来看看i=i++的情况:
所以这样最后一次循环内的结果仍旧是i(即0)。
而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。 【转自www.bitsCN.com】