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


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

    我们来看这样一段程序:

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

    它的运行结果是:

    [java] view plaincopy
     
    1. sum1=1  
    2. sum2=3  


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

    [cpp] view plaincopy
     
    1. void main()    
    2. {  
    3.     int i,sum1,sum2;  
    4.   
    5.     i=0;  
    6.     sum1=(i++)+(i++);  
    7.     printf("sum1=%d ",sum1);  
    8.   
    9.     i=0;  
    10.     sum2=(++i)+(++i);  
    11.     printf("sum2=%d ",sum2);  
    12.   
    13.     getchar();  
    14. }  

    它的运行结果是:

    [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++在对一些基本类型以及指针类型进行后置自增操作时,编译器将省去中间缓存变量的操作。

  • 相关阅读:
    Mysql 删除表
    Mysql 创建表
    Mysql left join
    Qt(Mac) 进程的启动
    Mysql update
    Mysql insert
    Mysql select
    Mysql INNER JOIN
    Mysql 别名
    Mysql 排序
  • 原文地址:https://www.cnblogs.com/kaikailele/p/3916614.html
Copyright © 2020-2023  润新知