黑马程序员技术交流社区

标题: 短短几行代码绕晕很多人 [打印本页]

作者: xtxiaolu    时间: 2014-4-17 18:32
标题: 短短几行代码绕晕很多人
本帖最后由 xtxiaolu 于 2014-4-17 21:39 编辑

       int j = 0;
        for (int i = 0; i < 100; i++)
                j = j++;
        System.out.println(j);
   
看到这道题首先想到的是101
但是为什么这道题的答案是0呢!黑费解!
            

作者: 轻语。    时间: 2014-4-17 18:44
本帖最后由 伍叶竹 于 2014-4-17 19:03 编辑

循环体还有半个中括号去哪里了。。。j=j++ 中  ++是单目运算符优先级别比关系运算符=高,  j使用后自加成1,  但此时又进行了赋值运算, j=j++ 可以看成  j++  ; j=0 ;这样J的之就又回到了0 。

作者: 天山    时间: 2014-4-17 18:44
package com.itheima;
//   J++自加了,可是值没赋进 J去,
public class do_while {
               
        public static void main(String []args)
        {       
                int j=0;
                for(int i=0;i<100;i++)
                {
                        j=++j;
                        System.out.println(i+"次运行时J的值"+j);
                }
                System.out.println(j);
        }

}



96次运行时J的值97
97次运行时J的值98
98次运行时J的值99
99次运行时J的值100
100

作者: 月光海    时间: 2014-4-17 18:44
本帖最后由 月光海 于 2014-4-17 18:46 编辑

很简单,执行完j=j++;j的值还是0,至于为什么,你看懂m=n++;就明白了。m的值为计算前n的值,所以j还是0,如果是j=++j就不一样了
作者: ⒈心只霸占沵    时间: 2014-4-17 18:55
  1.   int j = 0;
  2.                  for (int i = 0; i < 100; i++){
  3.                       j = j++;//j=j++;先赋值后自增  先把j赋值给j ,再把j的值加1  所以一直循环的执行  j本来就是0 一直都是0赋值给0
  4.                                 //换成 j=++j;  先把j的值加1 然后再赋值给j   
  5.                  }
  6.                  System.out.println(j);
复制代码

作者: Doraemon    时间: 2014-4-17 18:56
因为j++是后增运算,j++的值并没有赋值给j
作者: xtxiaolu    时间: 2014-4-17 18:58
伍叶竹 发表于 2014-4-17 18:44
循环体还有半个中括号去哪里了。。。

没有那个括号的就是对这道题的理解 为什么他会等于0 呢
作者: 轻语。    时间: 2014-4-17 19:01
xtxiaolu 发表于 2014-4-17 18:58
没有那个括号的就是对这道题的理解 为什么他会等于0 呢

j=j++ 中  ++是单目运算符,优先级别比关系运算符=高,  j使用后自加成1,  但此时又进行了赋值运算, j=j++ 可以看成  j++  ; j=0 ;这样J的之就又回到了0 。
作者: xtxiaolu    时间: 2014-4-17 19:02
⒈心只霸占沵 发表于 2014-4-17 18:55

不是的呀j++本身就是0+1所以j是1又符给了变量j

但是为什么最后输出的却是0呢  你的答案不太真确吧!
作者: 轻语。    时间: 2014-4-17 19:02
xtxiaolu 发表于 2014-4-17 18:58
没有那个括号的就是对这道题的理解 为什么他会等于0 呢

分解一下,就赋值  j = 0;永远在输出语句之前。
作者: xtxiaolu    时间: 2014-4-17 19:03
⒈心只霸占沵 发表于 2014-4-17 18:55

不是的呀j++本身就是0+1所以j是1又符给了变量j
但是为什么最后输出的却是0呢,你的答案不太真确吧!
作者: kuroro自走核炮    时间: 2014-4-17 19:40
xtxiaolu 发表于 2014-4-17 19:03
不是的呀j++本身就是0+1所以j是1又符给了变量j
但是为什么最后输出的却是0呢,你的答案不太真确吧! ...

j=j++
和m=n++一个原理。
j=自增前的j 也就是等于0
然后j自增,但是自增后的值没有储存进j,也就是丢失了。
所以最后得到的j还是零。
作者: 橡皮-leo    时间: 2014-4-17 21:34
其实这个只要理解了j++跟++j的区别就可以很好的理解了。j++是先赋值后运算,每次都是把j本身的值0赋给了j,然后这次循环结束,而j的值还是0这样一直循环下去j一直是0;++j是先运算再赋值,也就是说本身先+1,然后赋值给j。
作者: becky_ny    时间: 2015-10-2 18:20
我这两天也才真真的闹明白++和--运算符,这个只需将j=j++换位x=j++就可理解。
  1. int j = 0;
  2.         for (int i = 0; i < 100; i++)
  3.                 j = j++;
  4.         System.out.println(j);        //输出结果:0

  5. 解析:㈠此处得真正理解j++和++j的区别。j++,先赋值再自增;++j为先自增再赋值。㈡x=j++,过程是将j++的整体表达式的值赋给x,然后j再自增一次㈢而此处为j=j++,是将j++的值(为0)赋给j(仍然为0).然后循环100次。
复制代码

大神勿喷啊,我也是谢谢评论,顺道复习复习。




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