黑马程序员技术交流社区

标题: 小问题 int i = 0; i = i++; 结果还是0 为什么? [打印本页]

作者: 939676244    时间: 2013-9-25 13:11
标题: 小问题 int i = 0; i = i++; 结果还是0 为什么?
本帖最后由 939676244 于 2013-9-27 15:50 编辑

如题 int i = 0; i = i++; 结果还是0 为什么? 看了半天还是不理解, 只是记住结果了

作者: 落木萧萧    时间: 2013-9-25 13:22
本帖最后由 落木萧萧 于 2013-9-25 14:25 编辑

自加运算是这样的:i++意思是先将i声明初始化为0(int i=0),然后将将i赋值为i(i=i++),这里的i自加,是先赋值,先把i的值赋给别人,自己再累加一次,所以最后输出的i自然还是最初始的i,即0;
所以不能如果i=i++,但是i=++i,这样是可以的。

作者: 939676244    时间: 2013-9-25 13:30
public class Test123 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                int i= 0 ;
                 i = i++;
                 System.out.println(i);
               

        }

}
作者: 黑色海    时间: 2013-9-25 13:39
本帖最后由 黑色海 于 2013-9-25 13:40 编辑

优先级问题,i++是基本运算符,直到输出的时候i中存储的还是0.
System.out.println(i++);  也是0.
只能说运算的时候,i中的值一直都是0,更深的解释,就不知道了

作者: 张慧    时间: 2013-9-25 14:18
int i = 0;
i = i++;
这个过程应该是i先在内存中开辟一个临时空间用来存储i的值0,随后i再加1,i就变成1,最后再将临时的值赋给i,那么i的值就又被0给替换掉了。

如果是i= ++i的话,就是i先加1,在保存到临时的空间中,最后再将临时的值赋给i。如果没有"="号的话,也就没有赋值了,++i和i++的区别就不用多说了。
作者: yting_xmei1129    时间: 2013-9-25 17:11
饿先说一下++i与i++的区别吧!
1.在单独使用的时候i++ 和++i效果相同如 i++; 或++i;一样。
2.要是放在执行语句中时,两个的意义就不一样了如 while(i++<6)意思是先执行后运算,也就是先判断i<6后再i=i+1;相反while(++i<6)意思是先运算后执行,也就是先i=i+1后判断i<6;这里有个自己的记忆方法, ++在后则后运算(如i++<6)++在前则先运算 (如++i<6)
不知道这样能理解了没.

再来说下你这个问题
int i = 0;
i = i++;

这里 执行  i = i++;  的时候,先执行 i++ ,这属于先运算,后自加,这时候 i=0, i = i++;  的值也为0,然i再增加,i为2,这是属于隐藏的执行代码了,看来饿的表达能力有陷,不知道楼主明白了没有

希望可以帮到楼住...
作者: 王清华0    时间: 2013-9-25 17:50
很简单,楼上给你解释过i++和++i的区别了,其实这里最重要的一个问题是,i++的自增加一的执行是在=赋值之前还是之后。
  1. public class Test123 {

  2.     /**
  3.      * @param args
  4.      */
  5.     public static void main(String[] args) {
  6.             // TODO Auto-generated method stub
  7.             int i= 0 ;
  8.             i = i++;
  9.             System.out.println(i);
  10.             
  11.             int a=0;
  12.             a++;
  13.             System.out.println(a++);
  14.     }
  15. }
复制代码
运行结果是:
0
1
事实上i++的自增加一的执行是在=赋值之前的,也就是说,在赋值表达式右侧有变量使用i++这种右++的话,会在赋值之前完成自增加一,然后赋值,如果赋值表达式左侧有该变量,会造成难以预测的结果。
这句话:i=i++ 可以分成三步来看。
第一步,求表达式右侧的值,由以上程序证明,i++的值为0,此时赋值表达式右侧的值已经定下来了,是0。该值存于一个匿名的临时变量中。
第二步,完成i++的自增加一运算。此时i=1了。
第三部,完成赋值,i重新被匿名的临时变量赋值为0。
不知道这么说楼主理解么。
作者: 落木随风    时间: 2013-9-25 20:34
i=i++ 这个有运算符优先级 = 优先于 后++  也就是说 i 将自己的值赋给 i之后 才会自加一  这个时候i=i++  左边的i=0,右边i++=1,例如 继续下面输入i= i++ +i++ +i++  这个时候 左边i= 6  右边 分别为 2  3  4  这个6其实就是 1  + 2 + 3  这个时候楼主发现规律了吗?如果没有 你就在下面继续输入 上面的内容。还有个事i=++i  这个时候显示的就是1了,这是因为前++的优先级大于=  因此当i自加一以后才赋值给i  如果后面继续i=++i + ++i + ++i 这个时候就是 9  = 2+3+4 了。楼主可以多这样试几次就慢慢懂了。



作者: sergio    时间: 2013-9-25 20:58
看下优先级吧。=和++的优先级吧
作者: 于振发    时间: 2013-9-26 00:41
  ++ 是自加一,如果是前加加++i那么代表在参与运算前先把值加1,然后进行运算,如果是后加加i++,那么是在运算过后在把i的值加1
作者: 939676244    时间: 2013-9-26 08:41
王清华0 发表于 2013-9-25 17:50
很简单,楼上给你解释过i++和++i的区别了,其实这里最重要的一个问题是,i++的自增加一的执行是在=赋值之前 ...

已经理解了 谢谢
作者: Simple_love    时间: 2013-10-2 19:29
上面的解释的很清楚, 但是有一点,我补充一下, 假如int i=0  int j=i++,这时打印i和j的值。j的值会是0这里不需要我多解释,上面已经介绍很清楚, 但是i的值就是1,因为i++这时i的已经加自增加一,而j的值是把没有自增加1的i赋给j, 所有为0 ,这紧紧是个人理解, 不足的地方希望大家提议,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2