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

问题

    大家可以在不运行的情况下得出这个问题的答案吗?可能你会不加思索地说答案是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(八百里秦川@龙城异客)            

时间: 2024-10-26 15:14:59

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

请问c语言中,int a=0;变量名a和数值是怎么在内存分配的

问题描述 请问c语言中,int a=0;变量名a和数值是怎么在内存分配的 我看了很多答案,有些说只分配一个内存存0,a被隐藏了那么这个隐藏又是怎么个隐藏法呢还有说a和0同时存着不懂,求指教 解决方案 每次我们要使用某变量时都要事先这样声明它,它其实是内存中申请了一个名为i的整型变量宽度的空间(DOS下的16位编程中其宽度为2个字节),和一个名为a的字符型变量宽度的空间(占1个字节).i在内存起始地址为6上申请了两个字节的空间(我这里假设了int的宽度为16位,不同系统中int的宽度可能是不一样的

GWT 2.0 UiBinder 实现一个简单的分页.实现简单的CRUD.

 简单的 分页实现. 当点击新增 和修改 的时候 弹出 窗口.           package com.toeoso.client.panel; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.U

c++-C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么?

问题描述 C++中指针声明时,int* p=0跟int *p=0哪个比较好?为什么? 新手学习C++时候,发现有些书写 int* p=0; 有些书写: int *p=0; 这两个有区别吗?区别在哪里?为什么会有两种写法? 还有下面的两种有区别吗?区别在哪里? int* const p=0; int const *p=0; 解决方案 第一个问题,这是定义一个int* p指针变量,(int p)<--->(int p) 这两种是等价,编译器会处理中间的空白符问题.第二个问题,int *const

c++-使用如下代码,为何不能完全删除CImageList中所有的图片 for (int i = 0; i &amp;amp;lt;

问题描述 使用如下代码,为何不能完全删除CImageList中所有的图片 for (int i = 0; i < 使用如下代码,为何不能完全删除CImageList中所有的图片 for (int i = 0; i < m_myImageList.GetImageCount(); i++) { m_myImageList.Remove(i); } 解决方案 Remove会改变GetImageCount的结果, 你这个for循环相当凶险 解决方案二: 0 Remove会改变GetImageCoun

java算法-for(int i=0;i&amp;amp;lt;nums.length;i++)?

问题描述 for(int i=0;i<nums.length;i++)? 我想知道 for(int i=0;i<nums.length;i++){ 当 i<= 的时候没有报错但是为什么不能执行? 解决方案 for(int i = 0; i --continue:}??//在以上这个for循环中,这个 i 的自加是不受continue的影响的,就是说 i 的自加是//在continue之前的,或者说是在循环之外的.??for(int i = 0; i --break:}?//以上这个for

《Python数据科学实践指南》——0.4 一个简单的例子

0.4 一个简单的例子 下面是一段用Python编写的有趣的代码,这里所用的模块并不会在本书中进行讲解,仅仅是向购买本书的你表示我的感激. 代码清单如下: # ! /usr/bin/python # -- coding: utf-8 -- import sys from colorama import init init(strip=not sys.stdout.isatty()) from termcolor import cprint from pyfiglet import figlet_

《Python数据科学实践指南》一0.4 一个简单的例子

0.4 一个简单的例子 下面是一段用Python编写的有趣的代码,这里所用的模块并不会在本书中进行讲解,仅仅是向购买本书的你表示我的感激. 代码清单如下: # ! /usr/bin/python # -- coding: utf-8 -- import sys from colorama import init init(strip=not sys.stdout.isatty()) from termcolor import cprint from pyfiglet import figlet_

《Python数据科学实践指南》——0.4节一个简单的例子

0.4 一个简单的例子下面是一段用Python编写的有趣的代码,这里所用的模块并不会在本书中进行讲解,仅仅是向购买本书的你表示我的感激.代码清单如下: # ! /usr/bin/python # -*- coding: utf-8 -*- import sys from colorama import init init(strip=not sys.stdout.isatty()) from termcolor import cprint from pyfiglet import figlet_

草根做网站简单的想法收获不简单的结果

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 众所周知,现在是互联网的时代,人们的生活以及商业都离不开互联网,就连最保守的事业单位和政府机关也开始对互联网感兴趣了,比如什么电子政务以及政务微博等等.可想而知现在互联网的重要性,互联网同时还有一个特性就是变化得快;也正是因为这样就有了更多的机会,当然同时也存在更多挑战.而对于众多充满理想抱负可在传统行业没办法去实践的草根而言,这毫无疑问是一