`
啸笑天
  • 浏览: 3461379 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

无影无踪的增量(又理解下java的的引用....)

    博客分类:
  • java
阅读更多

public class Increment {

public static void main(String[] args) {

int j = 0;

for (int i = 0; i < 100; i++)

j = j++;

System.out.println(j);//结果输出还是0

}

}

----------------------------------------------------------------------------------------------------------------------------

下面是我网上找到通俗易懂的原理性的正确解释:

学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试: 
  
  JAVA: 
  public class test
  { 
  public static void main(String args[]) 
  {
  inti,j;
  i=0;
  for(j=0;j<5;j++)
  {
   i=i++;
  System.out.println("i="+i);
  }
  } 
  }
  
  C:
  #include
  main()
  {
   inti,j; 
       i=0; 
  for(j=0;j<5;j++) 
  { 
   i=i++; 
  printf("i=%d\n",i);
  }
  }
  你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。 
  第一个JAVA程序得出的结果如下: 
  i=0 
  i=0
  i=0
  i=0
  i=0
  而第二个C程序得出的结果如下:  
  i=1
  i=2
  i=3
  i=4
  i=5
  同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,
java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:
   
  i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
  
  明白了上面的问题,让我们接下来看看i=i++的情况:
  


  所以这样最后一次循环内的结果仍旧是i(即0)。
  
  而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。

------------------------------------------------------------------------------------------------------------------------------

这里说下我的理解:

大家都知道java处处是引用,所以int i=0;i=i++;:

i分配一块内存空间存放0。i首先分配一块临时内存存放i原来的值,因为++的优先级高于=,所以i在原来的内存自加了1,但由于赋值操作使i引用了这个临时内存,结果i原来的内存就没有被引用了将被虚拟机垃圾回收机制回收。

相当于: 

             int i=0;

             int temp = i;

             i++;
             i = temp;

那我们不防来看看int i=0;i++;:

i分配一块内存空间存放0。i首先分配一块临时内存存放i原来的值,i在原来的内存自加了1,由于i还是引用原来的内存空间所以临时的内存就没有被引用了将被虚拟机垃圾回收机制回收。

相当于: 

             int i=0;

             int temp = i;

             i++;

i++和++i可以这样理解:

i++是先分配一块临时内存放原来的值,i在原来的内存自加1,然后在用这个临时内存进行计算

++i是先自加1,再分配一块临时内存放自加1后的i的值,然后在用这个临时内存进行计算

-------------------------------------------------------------------------------------------------------------------------------

在看看JVM那玩意:

在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。 
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);

语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。 
又因为i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。

i = 1;i = i++
相当于下面的汇编码
0 iconst_1 ; 把1放到堆栈
1 istore_1 ;从栈顶取出1并存在局部变量1中(也就是变量 i ) 这时候i=1(赋值);

2 iload_1 ; 把i的值放到堆栈里去,这时候栈顶为1
3 iinc 1 1 ;把变量1(也就是 i)加1,这时候i = 2

6 istore_1 ;从栈顶取出1存到i里去,呵呵i又回到1了。
7 return ; 返回。

 

i = 1 ; i=++i
0 iconst_1 ; stack=[1];
1 istore_1 ; stack=[] ; i =1;

2 iinc 1 1 ; stack=[];i=2;
5 iload_1 ; stack=[2];i=2;

6 istore_1 ; stack=[];i=2;
7 return

 

也来看一下:

i = 1; i = i+1
0 iconst_1 ; stack = [1];
1 istore_1 ; stack =[] ; i = 1;

2 iload_1 ; stack = [1]; i = 1;
3 iconst_1 ; stack = [1,1] ; i =1; 
4 iadd ; stack =[2];i = 1; 
5 istore_1 ; stack = [];i =2;
6 return 

 

分享到:
评论

相关推荐

    无影无踪工具.rar

    《无影无踪工具——深度探索隐私保护与数据安全》 在数字化日益普及的时代,个人隐私和数据安全问题越来越受到重视。"无影无踪工具"正是为了解决这一问题而设计的专业软件,它旨在帮助用户消除计算机上的浏览痕迹、...

    无影无踪[WYWZ]控制台v3.0_清理系统垃圾.exe

    无影无踪[WYWZ]控制台v3.0_清理系统垃圾.exe

    无影无踪.rar

    无影无踪(WYWZ控制台)  WYWZ是一个保护你的计算机隐私的小型绿色软件,如果你不注册为开机自动启动以及右键关联、native启动清理等则为绿色软件,所有配置都记录在配置文件中,可以方便的在移动磁盘中保存使用。...

    无影无踪软件

    【标题】:“无影无踪软件”是一款专用于数据擦除的工具,旨在帮助用户彻底删除计算机中的文件或程序,确保其无法通过常规手段恢复。该软件的主要特点是其高效的数据清理能力和高度的安全性。 【描述】:根据描述,...

    清除所有痕迹 -无影无踪

    "清除所有痕迹 -无影无踪"这一软件工具专门针对这一需求,旨在帮助用户彻底清理计算机使用过程中产生的各种痕迹,确保信息不被泄露,满足保密检查的要求。下面将详细介绍相关知识点。 首先,了解什么是计算机痕迹...

    无影无踪,系统优化工具

    "无影无踪"是一款专为Windows操作系统设计的系统优化工具,主要针对XP、Win7、Win2000和Win2003系统提供性能提升和垃圾清理服务。这款软件能够帮助用户有效地管理和维护他们的计算机,提升电脑运行速度,减少系统...

    无影无踪 wywz 4.3

    "无影无踪 wywz 4.3"是一款针对计算机系统的快速清理工具,主要用于清除系统中的临时文件、日志、缓存等无用数据,从而优化系统性能和释放硬盘空间。这款软件的设计理念是简洁高效,用户在使用后能够明显感受到系统...

    无影无踪的牙齿作文.doc

    6. **错误预防**:防止牙齿再次无影无踪,可以学习如何正确处理摇晃的牙齿,对应到IT,我们应学习如何避免数据丢失,比如定期维护硬件、安装防病毒软件和更新系统补丁。 通过这个故事,我们可以将生活中的经验转化...

    无影无踪1.0.1.2纯绿色版

    "无影无踪1.0.1.2纯绿色版"是一款专为用户设计的系统垃圾清理工具,旨在帮助电脑用户高效地清理系统中的无用文件,提高计算机的运行速度和存储空间。作为一款绿色软件,它无需安装,下载即可直接使用,不占用过多...

    无影无踪WYWZ

    无影无踪WYWZ是一个保护你的计算机隐私的小型绿色软件,如果你不注册为开机自动启动以及右键关联、native启动清理等则为绿色软件,所有配置都记录在配置文件中,可以方便的在移动磁盘中保存使用。WYWZ能够全面、快速...

    [wywz]无影无踪

    无影无踪[wywz] 擦除对电脑的操作痕迹

    无影无踪(痕迹清理)

    首先,我们要理解什么是"痕迹"。在计算机上,当你浏览网页、使用应用程序、下载文件或进行任何操作时,都会留下一定的痕迹。这些痕迹可能包括临时互联网文件、浏览器历史记录、系统日志、注册表项、最近打开的文件...

    让你的电脑飞快!~无影无踪清理软件

    "无影无踪清理软件"能够智能扫描并识别这些垃圾文件,确保在不影响系统正常运行的前提下进行安全清理。 该软件的核心功能包括: 1. **深度扫描**:采用先进的扫描算法,全面查找电脑中的临时文件、系统日志、垃圾...

    无影无踪_窗口、图标隐藏软件 私密密码保存 v1.0.zip

    本无影无踪软件就是解决这些问题。   【软件功能】 1:热键隐藏正在操作的窗口,图标,这样不用担心上班玩其它东西了。 2:可以安全保存各种账号密码。 3:放心在上面写日记。 4:可以保存各种电话号码。  ...

    无影无踪5.0

    "无影无踪5.0"是一款专注于数据安全与隐私保护的软件,其主要功能是自动擦除用户在计算机上留下的各种痕迹,并通过多次覆盖的方式彻底删除选定的文件,确保信息无法被恢复。这款软件的出现,对于那些对数据隐私有...

    无影无踪 V 3.0

    "无影无踪 V 3.0"是一款专注于垃圾信息处理的软件,旨在为用户提供高效、便捷的解决方案,帮助用户清理计算机中的各种无用、冗余或者潜在的有害数据。这款工具可能包含了智能扫描、深度清理、隐私保护等多个功能模块...

    擦出碎片、网页记录等工具——无影无踪WYWZ

    《无影无踪WYWZ:深度清理电脑隐私与安全维护》 在信息化时代,个人隐私保护和电脑安全越来越受到重视。"无影无踪WYWZ"是一款专门针对这些问题设计的绿色软件,旨在帮助用户彻底清除电脑中的敏感信息,如Word文档...

    wywz-无影无踪-计算机垃圾清除工具

    "wywz-无影无踪-计算机垃圾清除工具" 这个标题提到了一个名为 "无影无踪" 的软件,它是一个专门用于清理计算机垃圾的工具。"wywz" 可能是软件的缩写或者版本号,127可能代表该版本的编号或者与软件的某种特性相关。 ...

    无影无踪系统优化工具

    "无影无踪系统优化工具"是一款功能强大的系统优化软件,旨在提高计算机的运行效率,清理不必要的文件,修复系统问题,以及提供全方位的系统维护。该工具可能包含多个组件,如磁盘清理器、注册表清理器、启动项管理器...

    无影无踪WYWZ是一个保护你的计算机隐私的小型绿色软件

    **无影无踪WYWZ:一款保护计算机隐私的小型绿色软件** 无影无踪WYWZ是一款专注于保护用户隐私的软件,它以其小巧的体积、高效的操作和强大的隐私清除功能,为用户提供了全面的数据安全解决方案。这款软件设计的目标...

Global site tag (gtag.js) - Google Analytics