• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

int i=0;i=i++;i=?//简单问题背后的不简单道理

发布: 2007-7-01 18:47 | 作者: admin | 来源: | 查看: 11次 | 进入软件测试论坛讨论

领测软件测试网     大家可以在不运行的情况下得出这个问题的答案吗?可能你会不加思索地说答案是1,当初我也是这么认为的,可是运行的结果让我很吃惊,0!    为什么会这样呢?    下面我们对比两段程序和它们的汇编代码(javap -c xxx得到):    int i=0;     i=i++;                                                 int i=0;         i=++i;     ------------------------------------------------------------------------------------       0: iconst_0                                                       0: iconst_0    1: istore_2                                                         1: istore_2    2: iload_2                                                           2: iinc 2, 1    3: iinc 2, 1                                                           3: iload_2    4: istore_2                                                          4: istore_2    5: return                                                              5: return    它们区别在于2,3两句。    从优先级来看  "前++" >" =" > "后++",所以汇编代码清楚地显示了代码执行地过程。    第二段代码地结果是1,没有问题。    从汇编代码来看,=赋值地过程是先利用临时变量计算=右边地值,然后在赋给左边地变量。    这样,我们就很容易解释第一段代码地运行结果了:    临时变量先得到i原来地值是0(汇编代码1),这时候考虑优先级,=大于后++,所以临时变量就执行赋值操作,之后临时变量先读出i地值(汇编代码2),再进行++操作(汇编代码3),但是++操作只是在临时变量自己身上加一,不会影响原来地i值。    按照上面地思路再分析第二段代码,也就顺理成章了:)    总结:java中的=操作由临时变量计算结果,然后再赋回原变量,由于优先级问题就会出现意想不到的结果,仔细分析流程就能得出结果。论坛原贴:http://community.csdn.net/Expert/TopicView3.asp?id=3885309感谢:blackhost(剑心),kingfish(八百里秦川@龙城异客)            

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网