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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© idream 中级黑马   /  2014-4-20 22:13  /  1686 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 idream 于 2014-4-20 22:57 编辑

public static void main(String[] args) {
                int i = 3;
                i = i++;
                System.out.println("i="+i);//结果为何是3,而不是4呢?
}

12 个回复

倒序浏览
这个问题很简单,先看后++就是你这种情况

  i = i++; //后++会把i的值赋给i在回来自己自增一次
如果是 i = ++i;   //先++,i会先自增然后再赋值给i;
那么输出结果就是4了   
应该很好理解吧   ,另外毕老师视频里有讲的很明白 你回去看看在 加油!

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
本帖最后由 ☆枫の云 于 2014-4-20 22:34 编辑

这个问题很简单啦,视频上毕老师说的很清楚,关于b=a++;和b=++a;的区别,
很简单你看哪个离等号近,就先执行什么,b=a++就是先把a的值赋给b再自己++,
而b=++a则是先++然后再赋值给b

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
++是自增运算符,++在前和在后是不一样的,++在后表示先参与运算再自增1,++在前表示先自增1再参与运算,在本例中:输出的是i++,先参与运算再自增1,所以结果应是3,而不是4。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
i = i++; 是先将i的值赋值给i,然后在进行自增,自增的结果并没有进行赋值。所以结果是3。
如果是i=++i; 那就是先进行自增,然后把自增后的值赋给i。这样的情况下结果就是4了。
回复 使用道具 举报
int i = 3;
                 i = i++;     //   ++在右边,先赋值再自加 结果是i =3    system输出3,然后执行++,i=4;
                 System.out.println("i="+i);
回复 使用道具 举报
peku 中级黑马 2014-4-20 22:46:46
7#
举个例子
int a,b=1;
a=b++;/*因为这句话程序的实现最终是通过内存来实现的,在java中这句话真正的执行顺序是将b的值取出来放入内存的另外一个地方我们称这个地方为临时的C,然后将b的值加1,最后再将C中的值赋给a,将b换成a,这样就可以知道:
int a=1;
a=a++;其实是将进行了C=a->a++->a=C的动作,所以相当于兜了一圈又回来了
回复 使用道具 举报
请记住:++在后面就先用变量在自加1,++在前就先自加1再用!哦也!!
回复 使用道具 举报
这个问题就是关于前++和后++的区别
i = i++; 后++会把i的值赋给i后,自己自增一次
i = ++i;   前++,i会先自增一次,然后再赋值给i

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
本帖最后由 tacyjay在路上 于 2014-4-20 23:30 编辑

了解了一下,这个问题,并没有看起来的那么简单,涉及到java的编译机制(参考下面的那篇文章),。

其实楼主想实现的应该是这个i++;语句的这个功能吧,可是“错”写成了i=i++; 因为实际上自增不会使用这种方式,而是i++;语句。

现在我把类似的几个需要分辨清楚的,写在了这个小程序中,希望对你有所帮助。
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int m = 3 , n ;
  6.                 n = m++;//m先把3赋给n,然后自增1,所以语句执行后是m=4;n=3
  7.                 System.out.println("m="+m+";n="+n);//输出结果是:m=4;n=3

  8.                 //下面再看这个例子
  9.                 int i = 3 , j = 3;
  10.                 i = i++;//结果是i=3,实质上是与java的编译机制有关。
  11.                 j++; // j自增,这句 之后,j=4
  12.                 System.out.println("i="+i+";j="+j);//输出结果是:i=3;j=4
  13.         }        
  14. }
复制代码
参考文章的地址:  http://wenku.baidu.com/link?url=GE7Mf3cpOxTUW6IlnuQi0h1jkoLv1W-iCNzm1brisTtQ0MUaBJbJ_dxUYzpJqtqvxzGGZM7bqBF2Wt0Aq3Ec32nWoS0yhyjTzMCw_ZCTEpO
或者
http://blog.sina.com.cn/s/blog_e8d9ad7a0101fjca.html





评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 tacyjay在路上 于 2014-4-21 07:54 编辑

       昨晚回答了这个问题后,临睡前还在思考这个问题,我觉得我举得这个例子需要认真思考,才能理解说的是什么,就连我自己当时也不是很确定。

       j=i++;这种方式(请注意是j),完全是会按先赋值后自增的方式,但唯独是i=i++;这种方式不是!!!,为了弄清楚,下面我举个更有说服力的例子:
  1. class Test1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i = 3;
  6.                 int j=3;

  7.                 i = i++;//按照++的原则,似乎是右边的i先把3赋给左边的i,然后再自增1,可事实是这样吗?看下面这个例子。
  8.                 j++;//这个是正常写法,j自增1
  9.                 System.out.println("i="+ i +";j="+j);//这里,输出:i=3;j=4


  10.                 i = i++;//这里,如果真是如在上个步骤中所说,此时的i应该是等于4,然后就接着按上述步骤进行,可事实上呢?
  11.                 j++;
  12.                 System.out.println("i="+ i +";j="+j);//这里,输出:i=3;j=5 。

  13.                 //于是我有个疯狂的想法,用下面这个例子来证明。
  14.                 i = i++;
  15.                 i = i++;
  16.                 i = i++;
  17.                 i = i++;
  18.                 System.out.println("i="+ i);//猜猜看,这个结果是多少?动手试试吧!
  19.         }
  20. }
复制代码
结果很意外,有木有!!!!(文章的最后有结果)
对于j=i++;这种情况(注意是j),毫无疑问,是先将i的值赋给j,然后i在此语句结束之后,就自增1。
对于i=i++; 按理说应该也是先把右边的i赋给左边的i,然后在此语句结束之后,i自增1,
可是事实上,无论i=i++;运行多少次,i的值都不变!!

所幸这种情况,仅限于i=i++;这种方式。对于这种情况,记住就好了。

如果你像我一样较真,那就接着看好了。

-----------------------------------------------完整文章贴不完,见附件----------------------------------------
javai=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=11i=10;而C/C++得到的都是11呢?

这是由于JavaC/C++采用的编译器不同,编译器不同,所以编译机制也不同。

关于java中i=i 的解释.zip (443.45 KB, 下载次数: 37)

-----------------------------------------------本例的结果在下面----------------------------------



回复 使用道具 举报
++i和i++的区别是前者先给i加1再赋值给左边,后者是先给左边赋值再给i加1。
回复 使用道具 举报
这个是先赋值在自增加一 所以i=3 不等于4
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马