Java程序員面試寶典(第二版)中有這樣一道筆試題:
- /**下列程序的輸出結果是()*/
- 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);
- }
- }
結果很像是 100,爲什麼是 0?
因爲Java用了中間緩存變量機制,所以j=j++;可以換成如下寫法:
- temp = j;
- j = j++;
- temp = j;
至此貌似是明白了!那麼再來一題:
- /**下來代碼執行的結果*/
- 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”。運算最終使用的,並不是變量本身,而是被賦了值的臨時變量。
上述程序計算方法:
- 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不同