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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 武嘉豪 中级黑马   /  2013-9-3 12:31  /  1150 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 武嘉豪 于 2013-9-3 14:26 编辑
  1. public static void main(String[] args){
  2. int i=0;
  3. i=i++;
  4. System.out.println(i);
  5. }
复制代码
为什么输出的不是1呢?
我理解的应该是先算i=i,然后再算i++
但是运算结果确实是0

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
你说的是对的,但你理解是错的
第一步确实是i=i
第二步是【i】=【i】+1
我之所以用【i】与i区分是因为这两个i是不同的变量
【i】在第二次运算中确实+1了,但它这个值并没有赋给我们的变量i
而我们要的变量i却在第一步受到赋值,i=【i】

评分

参与人数 1黑马币 +15 收起 理由
以防万一 + 15 赞一个!

查看全部评分

回复 使用道具 举报

1、++i 的用法(以 a=++i ,i=2 为例)

   先将 i 值加 1 (也就是 i=i+1 ),然后赋给变量 a (也就是 a=i ),

   则最终 a 值等于 3 , i 值等于 3 。

   所以 a=++i 相当于 i=i+1 ,a=i

2、i++ 的用法(以 a=i++ ,i=2 为例)

   先将 i 值赋给变量 a (也就是 a=i ),然后 i 值加 1 (也就是 i=i+1 ),

   则最终 a 值等于 2 ,i 值等于 3 。

   所以 a=i++ 相当于 a=i , i=i+1

3、++i 与 i++

   a=++i 相当于 i++ , a=i   

   a=i++ 相当于 a=i , i++

4、++i 与 i++ 单独使用时,相当于 i=i+1

   如果赋给一个新变量,则 ++i 先将 i 值加 1 ,而 i++ 先将 i 赋给新变量。

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 赞一个!

查看全部评分

回复 使用道具 举报
前几天有个哥们儿在论坛里问到过类似的问题了,这里我把它的题目与我的回答摘过来,相信你看完后,会对这一类的问题有所明白的,以下是这四道题以及对这四道题的详细讲解:
  1. 1.
  2. int count = 0;
  3. count = count + count++;
  4. System.out.println(count);
  5. 2.
  6. int count = 0;
  7. count = count++ + count;
  8. System.out.println(count);
  9. 3.
  10. int count = 0;
  11. for (int i = 0; i < 100; i++) {
  12. count = count + count++;
  13. }
  14. System.out.println(count);
  15. 4.
  16. int count = 1;
  17. for (int i = 0; i < 100; i++) {
  18. count = count + count++;
  19. }
  20. System.out.println(count);
复制代码
  1. 第一个问题: 要明白count = count + count++的结果,首先要知道两个问题:
  2. 第一个是这个运算的运算顺序,第二个是count++操作做了什么事,对于运算顺序,肯定是先运算等式右边的
  3. 再赋值给左边的变量,右边的运算是从左到右算的,明白了这两个问题再来看题就不复杂了. count = count +
  4. count++;先运算右边,右边从左到右算, 我们要是知道count++的结果就知道了右边的结果了,
  5. count在跟左边的count运算之前,会先进行一个复制,将原来的值复制一份,然后它本身的原值会自增,
  6. 需要注意的是原值的自增跟复制后的数据是没有关系的,自增后,原值变成1了, 这时候进行count +
  7. count++进行运算,但是count++参与运算的是复制出来的那份值而不是自增后的结果,
  8. 由于等式右边的左边的count是在count++运算前就有值的,所以它是0,而count++的结果是0,所以 就是 0 + 0,
  9. 然后将结果赋给了等式左边的count,结果打印就是0

  10. 第二个问题: 原理其实跟第一个问题差不多,但结果肯定是不一样的,因为等式右边的运算是要从左到右的,count++ + count,
  11. count先复制一份数据也就是0出来,然后进行自增这时候原值变为1了,而count++参与运算用的是复制出来的0参与
  12. 运算的,所以count++ + count实际上就是 0 + 1,为什么这里是0+1而不是0+0呢,因为count++运算虽然用的是复制出来
  13. 的那份数据,但是它本身的值已经自增到了1,而count++右边的那个count拿的是自增后的原值也就是1, 所以这个打印结果是1

  14. 第三个问题: 如果你第一第二个问题已经看懂了,我相信第三个问题已经不言自明了,count = count + count++;打印的结果
  15. 其实就相当于count = count + count;虽然两者底层运算有点差异,但结果是一样的, 所以这个for循环不管有多少次
  16. 结果都是0 = 0 + 0,结果都打印为0

  17. 第四个问题: 原理也是一样的因为count = count + count++的结果就相当于count = count + count;
  18. 所以再来看第四个问题的结果就不为怪了,但是第四个问题有些人可能会感到奇怪,因为结果是0,如果我们自己算也会感到奇怪,
  19. count首先等于1,for循环第一次1 = 1 + 1++结果为2(不解释了吧),再运算的数据会越来越大为什么会为0呢?
  20. 我也感到纳闷,但我知道一旦这个count有一次结构为0,后面的所有for循环计算出的结果都为0了,
  21. 所以我们找到为0的时候for循环中的i等于多少,
  22. 经测算i为31的时候,结果为0,而i为30的时候count等于-2147483648,二进制为
  23. 10000000000000000000000000000000,这时候count + count++, 就相当于count *2
  24. 了(两个相同的数据相加相当于乘以2, 这个不用解释吧),乘以2就相当于左移1位,结果为0,所以就出现了这样的结果了
复制代码

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 很给力!

查看全部评分

回复 使用道具 举报
应该是0;.自增后的i是为1, 但是你i=i++ 。这时会把原来没自增前的值0赋给i,此时i存的就是0;你要想得到其自增后的值,就不要赋给i,在重新申明一个变量并赋值给它就可以了如下代码就可以


public static void main(String[] args){
int i=0;int b;
b=i++;
System.out.println(i);System.out.println(b);
}


评分

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

查看全部评分

回复 使用道具 举报
谢谢楼上各位,已经想通咯~
回复 使用道具 举报
武嘉豪 发表于 2013-9-3 14:26
谢谢楼上各位,已经想通咯~

我知道,其实楼主很强大的,大牛
回复 使用道具 举报
估计是你看到后面了把前面的知识点给忘了吧! 毕老师不是教了口诀吗?1分钟就记得住了 主要看右边

i=i++    指的是先出去玩  后吃饭    等于号你就想象成你们家大门    离门近当然是先出去玩   后玩好了回家吃饭    所以直接就出门了   右边的i没有变化就直接给了左边啊   

i=++i    而这个呢   i离门比较远    肯定吃吃了饭再出去玩     你想想  吃完了饭  肯定是   出门前就有东西变化了呗   右边的i就变化后再给了左边啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马