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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xtxiaolu 中级黑马   /  2014-4-17 18:32  /  2355 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xtxiaolu 于 2014-4-17 21:39 编辑

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

评分

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

查看全部评分

14 个回复

倒序浏览
本帖最后由 伍叶竹 于 2014-4-17 19:03 编辑

循环体还有半个中括号去哪里了。。。j=j++ 中  ++是单目运算符优先级别比关系运算符=高,  j使用后自加成1,  但此时又进行了赋值运算, j=j++ 可以看成  j++  ; j=0 ;这样J的之就又回到了0 。
回复 使用道具 举报
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:46 编辑

很简单,执行完j=j++;j的值还是0,至于为什么,你看懂m=n++;就明白了。m的值为计算前n的值,所以j还是0,如果是j=++j就不一样了
回复 使用道具 举报
  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);
复制代码

评分

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

查看全部评分

回复 使用道具 举报
因为j++是后增运算,j++的值并没有赋值给j
回复 使用道具 举报
伍叶竹 发表于 2014-4-17 18:44
循环体还有半个中括号去哪里了。。。

没有那个括号的就是对这道题的理解 为什么他会等于0 呢
回复 使用道具 举报
xtxiaolu 发表于 2014-4-17 18:58
没有那个括号的就是对这道题的理解 为什么他会等于0 呢

j=j++ 中  ++是单目运算符,优先级别比关系运算符=高,  j使用后自加成1,  但此时又进行了赋值运算, j=j++ 可以看成  j++  ; j=0 ;这样J的之就又回到了0 。
回复 使用道具 举报

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

但是为什么最后输出的却是0呢  你的答案不太真确吧!

点评

j=j++, 因为=的优先级高于++所以执行j=j,此时j还是0,在执行j++,但是=已经执行过了,所以没有再把j++后的值再赋值给J,所以j依然是0,如此循环,最后还是0.  发表于 2014-4-18 11:57
回复 使用道具 举报
xtxiaolu 发表于 2014-4-17 18:58
没有那个括号的就是对这道题的理解 为什么他会等于0 呢

分解一下,就赋值  j = 0;永远在输出语句之前。
回复 使用道具 举报 1 0

不是的呀j++本身就是0+1所以j是1又符给了变量j
但是为什么最后输出的却是0呢,你的答案不太真确吧!
回复 使用道具 举报
xtxiaolu 发表于 2014-4-17 19:03
不是的呀j++本身就是0+1所以j是1又符给了变量j
但是为什么最后输出的却是0呢,你的答案不太真确吧! ...

j=j++
和m=n++一个原理。
j=自增前的j 也就是等于0
然后j自增,但是自增后的值没有储存进j,也就是丢失了。
所以最后得到的j还是零。

评分

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

查看全部评分

回复 使用道具 举报 1 0
其实这个只要理解了j++跟++j的区别就可以很好的理解了。j++是先赋值后运算,每次都是把j本身的值0赋给了j,然后这次循环结束,而j的值还是0这样一直循环下去j一直是0;++j是先运算再赋值,也就是说本身先+1,然后赋值给j。
回复 使用道具 举报
我这两天也才真真的闹明白++和--运算符,这个只需将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次。
复制代码

大神勿喷啊,我也是谢谢评论,顺道复习复习。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马