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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Sasson 中级黑马   /  2013-11-6 12:25  /  1255 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Sasson 于 2013-11-6 15:20 编辑

class Demo {
        public static void main(String[] args) {
                int i = 0;
                for(int x = 0; x < 10; x++) {
                        i=i++;
                }System.out.println(i);
        }
        
}

老师讲的是i++每次都保存在一个临时变量  没有给=号左边的  i   赋值  所以 i  还是为零   

求高手详细的解释·····

评分

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

查看全部评分

9 个回复

倒序浏览
这个是前++ 和后++的问题。区别在于i++是i先不自加,在语句完后自加,而++i则是先自加;
你代码中,第一次循环时候,当i=0时,传进来一个0,先不自加,那么此时i出去以后还是0,然后循环,进入第二次循环时由于i还是0,所以逻辑与结果与第一次一样,还是0,一直到循环结束,结果都一样,都是0。
如果改成 i=++i;就不一样了, 进来先让i进行自加,循环第一次i就等于1,然后赋值给i,i出去以后是1,然后进入第二次循环,进来是1,再自加,结果就是i=2,依次循环到最后一次,i=10;

评分

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

查看全部评分

回复 使用道具 举报
这个可以这么理解  用汇编可以怎么表示
pop i
mov CX,i
INC I
mov i CX
push i
意思就是 i值压入堆栈,但是i要自增 所以又被存到CX寄存器 进行自增运算后返回i ( 这里写i 实际应该是i的地址)然后返回后 把堆栈中的i值返回到i地址
相当于 这个过程中 地址i指向的数值由0变1在变0
个人的一点想法。。也请高手指教一下。。

评分

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

查看全部评分

回复 使用道具 举报
i=i++,i++先执行,此时,i会自增为1,但是i++会返回0——也就是说,当 i 刚变成1时,又被i++返回的0给取代了,所以。。。。一直都是0。。。。。
回复 使用道具 举报
i++ 确实是底层操作,也就是用汇编的那一套,
i = i++ 这个是优先级的问题,
等号的优先级永远是最低的,++的优先级是相当高的,
所以先计算 i++,
i++ = 0;这时候 i=1
然后计算 i = (i++) = 0
所以最后 i 还是等于 0 的
回复 使用道具 举报
你可以这样理解,i++相当于一个带有返回值的方法,这个方法里面,有一条i=i+1的语句,但是,返回值却是i-1,就像这个例子
  1. class Demo
  2. {
  3.                 static int i = 0;

  4.         public static void main(String[] args)
  5.                 {
  6.                
  7.                                 i=demo();
  8.                                 System.out.println(i);
  9.         }

  10.                 public static int demo()
  11.                 {
  12.                         i=i+1;
  13.                         return i-1;
  14.                 }
  15.         
  16. }
复制代码
如果这个代码看不懂就不要想它了,越想越迷糊

评分

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

查看全部评分

回复 使用道具 举报
其实就这么想就好了  i++是把i先压栈  就是备份一下  然后自增  最后把栈中的i拿出来用。。 i++相当于2个动作 备份 自增 而++i就一个动作 就是自增 而且 这里的自增运算级最高
回复 使用道具 举报
Sasson 中级黑马 2013-11-6 15:16:39
8#
嗯嗯  谢谢各位了
回复 使用道具 举报
class Demo {
        public static void main(String[] args) {
                int i = 0;                                                        //定义 int 类型的变量i=0
                for(int x = 0; x < 10; x++) {                //当x=0进入循环 // x=1 进入循环,.............
                        i=i++;                                                //i++ ,先把0赋值给左边变量i,然后i++等于1但是没有赋值给i,循环结束//i++ ,先把0赋值给左边变量i,然后i++等于1但是没有赋值给i,循环结束
                }System.out.println(i);
        }
        
}

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马