您的位置:首页 > 编程语言 > Java开发

Java中间缓存变量机制(i++)

2014-07-19 13:23 211 查看
Java程序员面试宝典(第二版)中有这样一道笔试题:

[java]
view plaincopy





/**下列程序的输出结果是()*/  
import java.util.*;  
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
结果很像是 100,为什么是 0?

因为Java用了中间缓存变量机制,所以j=j++;可以换成如下写法:

[java]
view plaincopy





temp = j;  
j = j++;  
temp = j;  

所以结果是 0 。(此为书中解释)
至此貌似是明白了!那么再来一题:

[java]
view plaincopy





/**下来代码执行的结果*/  
import java.util.*;  
public class Test2{  
    public static void main(String args[]){  
        int i = 0;  
        i = i++ + ++i;  
          
        int j = 0;  
        j = ++j + j++ + j++ + j++;  
          
        int k = 0;  
        k = k++ + k++ + K++ + ++k;  
          
        int h = 0;  
        h = ++h + ++h;  
          
        System.out.println("i="+i);  
        System.out.println("j="+j);  
        System.out.println("k="+k);  
        System.out.println("h="+h);  
    }  
}  

i=2

j=7

k=7

h=3

看到结果貌似不是真的明白Java的 i++和++i !

问题实质:在java中,执行自增运算时,会为每一个自增操作分配一个临时变量,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。

上述程序计算方法:

[java]
view plaincopy





int i = 0;  
i = i++ + ++i; //i=2,等效执行以下程序    
 /*    
  * temp1 = i;        //i=0,temp1=0  
  * i = i + 1;        //i=1    
  * i = i + 1;        //i=2    
  * temp2 = i;        //i=2,temp2=2   
  * a = temp1 + temp2 //i=2;    
  */      
 int j = 0;    
 j = ++j + j++ + j++ + j++;  //j=7      
 /*    
  * j = j + 1;        //j=1    
  * temp1 = j;        //j=1 , temp1=1  
 
  * temp2 = j;        //j=1, temp2=1  
  * j = j + 1;        //j=2  
   
  * temp3 = j;         //j=2,temp3=2 
  * j = j + 1;        //j=3 
   
  *temp4 = j;         //j=3 ,temp4=3 
  *j = j + 1;         //j=4 
   
  * j = temp1 + temp2 + temp3 + temp4 //j=7;    
  */      
   
 int k = 0;    
 k = k++ + k++ + K++ + ++k; //k=22      
 /*    
  * temp1 = k;        //k=0, temp1=0  
  * k = k + 1;        //k=1  
   
  * temp2 = k;         //k=1,temp2=1 
  * k = k + 1;        //k=2 
   
  *temp3 = k;         //k=2 ,temp3=2 
  *k = k + 1;         //k=3 
 
  * k = k + 1;        //k=4    
  * temp4 = k;        //k=4 , temp4=4  
   
  * k = temp1 + temp2 + temp3 + temp4 //k=7;     
  */      
     
 int h = 0;  
 h = ++h + ++h; //h=3      
 /*    
  * h = h + 1;        //h=1    
  * temp1 = h;        //k=1 , temp1=1  
   
  * h = h + 1;        //h=2    
  * temp2 = h;        //h=2, temp2=2  
  * h = temp1 + temp2 //h=3;    
  */   

需要注意的是:C语言中的计算方法和Java不同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java