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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘云龙 中级黑马   /  2012-10-17 12:06  /  1295 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. int i = 0;
  2. a = (i++) + (i++);a = (i++) + (++i);a = (++i) + (i++);a = (++i) + (++i);这四种情况结果?
复制代码
一道很经典的题,考查自加自减。之前自己也感觉很混乱,最近看了一篇分析,清楚了。
思路很简单:
1.i++,i--,这两种后缀式自增自减,先生成值,再执行运算;
2.++i,--i,这两种前缀式自增自减,先执行运算,再生成值;
  1. a = (i++) + (i++);
  2. 等价于
  3. a = i +i;
  4. i = i + 1;
  5. i = i +1;
  6. 所以结果为:a = 0;
复制代码
  1. a = (i++) + (++i);
  2. 等价于
  3. i = i + 1;
  4. a = i + i;
  5. i = i + 1;
  6. 所以结果为:a = 2;
复制代码
  1. a = (++i) + (i++);
  2. 等价于
  3. i = i + 1;
  4. a = i + i;
  5. i = i + 1;
  6. 所以结果为:a = 2;
复制代码
  1. a = (++i) + (++i);
  2. 等价于
  3. i = i + 1;
  4. i = i + 1;
  5. a = i + i;
  6. 所以结果为:a = 4;
复制代码
自减运算原理一样。
再遇到这种题,就这样分步算一下,就清楚了。


评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
舒远 黑马帝 2012-10-17 12:12:34
沙发
你有么有做过测试,你看看结果有几个是正确的?
回复 使用道具 举报
为什么我算出来,第一种情况是1.第四种情况是3呢?
回复 使用道具 举报
这是用加减乘除运行的结果,求高人指点

自增自减.png (4.25 KB, 下载次数: 15)

自增自减.png
回复 使用道具 举报
这里我忽略了一个问题,即自增自减在C与java中的实现是不同的。以上是看了一个C的帖子总结的,看到回帖的质疑后,重新编译验证后,发现在java中是错误的。
在java中结果为:1,2,2,3.
这里涉及到自增自减在C与java中的区别:
在java中,变量在每一次被引用时,都会创建相应的对象实例,分配相应的内存区域,其中的内容不会被重写,在变量的生命周期内的每一次引用就会有一个临时的实例对象被建立,它们的值互不影响。
  1. a = (i++) + (i++);
  2. 等价于
  3. a = 0+(i++);//此时i = 1
  4. a = 0 + 1;//此时i = 2;
  5. 所以结果为:a = 1;
复制代码
  1. a = (i++) + (++i);
  2. 等价于
  3. a = 0 + (++i);//此时i = 1;
  4. i = i + 1;//此时i = 2;
  5. a = 0 + 2;
  6. 所以结果为:a = 2;
复制代码
其他俩个类似
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马