本帖最后由 tacyjay在路上 于 2014-4-21 07:54 编辑
昨晚回答了这个问题后,临睡前还在思考这个问题,我觉得我举得这个例子需要认真思考,才能理解说的是什么,就连我自己当时也不是很确定。
j=i++;这种方式(请注意是j),完全是会按先赋值后自增的方式,但唯独是i=i++;这种方式不是!!!,为了弄清楚,下面我举个更有说服力的例子:
- class Test1
- {
- public static void main(String[] args)
- {
- int i = 3;
- int j=3;
- i = i++;//按照++的原则,似乎是右边的i先把3赋给左边的i,然后再自增1,可事实是这样吗?看下面这个例子。
- j++;//这个是正常写法,j自增1
- System.out.println("i="+ i +";j="+j);//这里,输出:i=3;j=4
- i = i++;//这里,如果真是如在上个步骤中所说,此时的i应该是等于4,然后就接着按上述步骤进行,可事实上呢?
- j++;
- System.out.println("i="+ i +";j="+j);//这里,输出:i=3;j=5 。
- //于是我有个疯狂的想法,用下面这个例子来证明。
- i = i++;
- i = i++;
- i = i++;
- i = i++;
- System.out.println("i="+ i);//猜猜看,这个结果是多少?动手试试吧!
- }
- }
复制代码 结果很意外,有木有!!!!(文章的最后有结果)
对于j=i++;这种情况(注意是j),毫无疑问,是先将i的值赋给j,然后i在此语句结束之后,就自增1。
对于i=i++; 按理说应该也是先把右边的i赋给左边的i,然后在此语句结束之后,i自增1,
可是事实上,无论i=i++;运行多少次,i的值都不变!!
所幸这种情况,仅限于i=i++;这种方式。对于这种情况,记住就好了。
如果你像我一样较真,那就接着看好了。
-----------------------------------------------完整文章贴不完,见附件----------------------------------------
关于java中i=i++的解释下面我将针对上次课程中,关于i++的问题给大家做个补充解释。 在上节课中,在讲到i++和++i的时候,给大家写了个例子: public class Test { public static void main(String[] args) { int i = 10; int j = 20; i = i++; System.out.println(i); } } 原本在第5行,我是想写j = i++;来着,但是错写成i=i++;也正是由于这个语句,得出了令人意想不到的结果。因为如果写成 j=i++; 那么会输出j=11; 而写成i = i++;则输出得到i=10;
而如果同样的代码换成C/C++执行,则无论是i=i++还是j = i++; 得到的结果是相同的,都是11,这是为什么呢?
其实就 i = i++;这个语句而言,其实很无聊,谁又会写这样一个语句呢(写错除外^_^),因为当你声明了 i = 0;后,要么你使用0,即直接使用i,要么你使用1,即用i++或者++i;没有必要写i=i++;所有这样的语句很无聊。但是正是这么个无聊的语句,引发了一个关于编译器编译机制的大问题的讨论!为什么java得到j=11,i=10;而C/C++得到的都是11呢?
这是由于Java和C/C++采用的编译器不同,编译器不同,所以编译机制也不同。
-----------------------------------------------本例的结果在下面----------------------------------
|