Java中的自增操作符与中间缓存变量机制

转自:http://blog.csdn.net/maggiedorami/article/details/7986098

我们来看这样一段程序:

  1. public static void main(String[] args){
  2. int i, sum1, sum2;
  3. i=0;
  4. sum1 = (i++)+(i++);
  5. System.out.println("sum1="+sum1);
  6. i = 0;
  7. sum2 = (++i)+(++i);
  8. System.out.println("sum2="+sum2);
  9. }

它的运行结果是:

[java] view plaincopy

  1. sum1=1
  2. sum2=3

而我用c语言编写相同逻辑的代码得到的却是不同的结果:

[cpp] view plaincopy

  1. void main()
  2. {
  3. int i,sum1,sum2;
  4. i=0;
  5. sum1=(i++)+(i++);
  6. printf("sum1=%d\n",sum1);
  7. i=0;
  8. sum2=(++i)+(++i);
  9. printf("sum2=%d\n",sum2);
  10. getchar();
  11. }

它的运行结果是:

[cpp] view plaincopy

  1. sum1=0
  2. sum2=4

这种不同是因为在c语言中,每个变量在它的生命周期内的每个时间点都只能有一个唯一的值。因此变量在每一次自增运算时,变量所对应内存区域的内容就被重写了。

而在java中,执行sum1=(i++)+(i++);创建了2个临时的整型变量对象,对来存储每次自增运算的结果。

java采用了这种中间缓存变量的机制。

再看程序员面试宝典中一个很经典的例子:

[java] view plaincopy

  1. public static void main(String[] args){
  2. int j = 0;
  3. for(int i = 0; i < 100; i++)
  4. j = j++;
  5. System.out.println(j);
  6. }

对java来说,j的输出值是0。

因为java的中间缓存变量机制使j=j++语句看以分解成如下操作:

[java] view plaincopy

  1. temp = j;
  2. j = j + 1;
  3. j = temp;

个人觉得这样使用自增并不好,应该在复杂语句中避免使用后置的自增(自减)。

另外,值得注意的是某些采用了中间缓存变量机制的语言,输出并不一定是0。比如C++在对一些基本类型以及指针类型进行后置自增操作时,编译器将省去中间缓存变量的操作。

Java中的自增操作符与中间缓存变量机制

时间: 2024-10-10 15:22:14

Java中的自增操作符与中间缓存变量机制的相关文章

java :: Java中的双冒号操作符

java中的双冒号操作符 定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion. 通常的情况下: 把 x -> System.out.println(x) 简化为 System.out::println 的过程称之为 eta-conversion 把 System.out::println 简化为 x -> System.out.println(x) 的过程称之为 eta-expansion 范式: 类名

Java中的中间缓存变量机制

上代码: public static void main(String[] args) { int j = 0; for (int i = 0; i < 100; i++) { j = j++; System.out.println(j); } System.out.println(j); } 如果按照Cpp的理解,这个结果应该就是100.不过java,是0. 是因为java中有关自增自减操作执行的,java会通过分配临时变量来执行的.如:j = j++, 是这么执行的: int temp =

转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法. 它们只能访问static数据. 它们不能以任何方式引用this 或super. 无论是static修饰的变量,还是static修饰的方法,我们都知道他们是属于类本身的,不是属于某一个对象的,当声明一个对象时,并不产生sta

Java基础知识强化10:Java中的中间缓存变量机制

1.对于自增运算++j与j++,由于加一的执行顺序不同,所以Java中有中间缓存变量来储存其单个表达式的值,而j的自增自减的结果依然保留在原来的变量储存区.因为本体是j的值,而单个表达式的值是中间产生的一个临时变量值,是在整条计算表达式结束后就可以抛弃的值,所以用个临时中间缓存变量在放就可以了.这就可以实现自增自减运算在计算时值的加减1顺序差异产生的表达式与本体值差异的两个变量储存. 2. 1 因为在计算过程中,使用了Java中间变量缓存机制.在java中,执行自增运算时,会为每一个自增操作分配

java 中的 sql 单引号双引号拼接变量

String sqlString="select * from tb_wf_main where trim(WF_NAME) = '   " + wfName.trim() + "  '    "; java中的字符串只能双引号(js可以单引号也可以双引号),以上,如果字符串中需要拼接变量,该变量用单引号括起来,然后加两个双引号再加两个加号,中间就是变量  只需要这样记住就行:单引号 括双引号 两个加号 中间变量   ( 0Q0   OMG)  js 也是可以这样拼

《Java程序员面试宝典》5.2.3——中间缓存变量机制

看到第三版中5.2的例题4,一开始只是简单地接受中间缓存变量的机制,例题如下: public class Test { public static void main(String[] args) { int j = 0; for (int i = 0; i < 100; i++) { j = j++; } System.out.println(j); } } 上述结果为0.解释如下: 1. temp=j; 2. j=j+1; 3. j=temp; 看到例题5里的题:int j = 0; j =

java中的SoftReference,应用其实现缓存

Cache.java 其中MAX_REF_SIZE指示存储多少引用后需要执行clean(),可以根据应用和虚拟机情况来设置,这里假设是1m的堆大小 1 import java.lang.ref.ReferenceQueue; 2 import java.lang.ref.SoftReference; 3 import java.util.concurrent.ConcurrentHashMap; 4 5 public abstract class Cache<X, T extends Cache

java中间缓存变量机制

public static void main(String[] args){ int j = 0; for(int i = 0; i < 100; i++) j = j++; System.out.println(j); } 输出结果:0 原因:j=j++;可以换成如下写法:temp = j; j=j+1; j=temp; 原文地址:https://www.cnblogs.com/xingrui/p/9552183.html

java中自增自减运算与c中自增自减的区别

今天看到java面试宝典里面有一道题目是这样的: 答案是0,我开始也有疑问,后来看到后面说到java的中间缓存变量,后来到网上查了查,终于理解了,是什么意思了.请看下面的代码和解释: package com.wj.demo; public class Test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int j=0; for(int i=