i++ 和 ++i 超有意思

  1. int i=4,j=3;     
  2. if((i = j++) != 4) {...}    
int i=4,j=3;   
if((i = j++) != 4) {...}  

j++的具體動作應該是怎樣的,我想看過《Thinking in Java》的朋友都掌握得還不錯,如果實在想找更深入一點探討i++的書,個人看過《Java程序員面試寶典》,裏面有提到i++這個部分,講得很仔細。j++,是一個依賴於java裏面的“中間緩存變量機制”來實現的,很多人都會念++在前就是“先加後賦”,++在後就是“先賦後加”,但是這個“賦”和這個“加”是針對哪個對象呢,有幾個人能清楚的解釋?“寶典”這本書上面的解釋,個人覺得非常好,就來這裏秀一段。首先,像文章中2樓所說那樣:++的時間是以整個語句爲衡量的,所以,什麼時候自增,跟一整句運算語句有關,現在的情況是 i = j++:這樣一句應該被拆分爲:

 

  1. temp = j;//先賦   
  2. j = j + 1;//後加   
  3. i = temp;  
temp = j;//先賦
j = j + 1;//後加
i = temp;

 

再來一個i = ++j:這一句應該被拆分爲:

  1. j = j + 1;//先加   
  2. temp = j;//後賦   
  3. i = temp;  
j = j + 1;//先加
temp = j;//後賦
i = temp;

用這樣的語句,來解釋“賦”跟“加”應該是很明瞭的吧?記住,“加”只涉及了本身,“賦”涉及本身和中間緩存變量。

如何理解“++的時間是以整個語句爲衡量的”?咱們來一段複雜的就可以很好地理解了,就拿那個被我噴的“石破天”的吧。

 

  1. /* 這個是原式,尊重版權,但是誤導人*/  
  2. int i=10;  
  3. i=i++ + i++;//20  --這裏應該會是21,note by jacob   
  4. i=++i + ++i;//44  --這裏應該會是45,note by jacob   
  5.    
/* 這個是原式,尊重版權,但是誤導人*/
int i=10;
i=i++ + i++;//20  --這裏應該會是21,note by jacob
i=++i + ++i;//44  --這裏應該會是45,note by jacob
 

 

首先咱們把這都拆開來理解:

  1. /* 細說第一個 i = i++ + i ++; */  
  2. temp1 = i;//temp1 == 10   
  3. i = i + 1;//i == 11;   
  4. temp2 = i;//temp2 == 11   
  5. i = i + 1;//i == 12;   
  6. i = temp1 + temp2;//i == 21  
/* 細說第一個 i = i++ + i ++; */
temp1 = i;//temp1 == 10
i = i + 1;//i == 11;
temp2 = i;//temp2 == 11
i = i + 1;//i == 12;
i = temp1 + temp2;//i == 21

  1. /*第二個 i = ++i + ++i;*/  
  2. i = i + 1;  
  3. temp1 = i;  
  4. i = i + 1;  
  5. temp2 = i;  
  6. i = temp1 +temp2;  
/*第二個 i = ++i + ++i;*/
i = i + 1;
temp1 = i;
i = i + 1;
temp2 = i;
i = temp1 +temp2;


這樣的例子,應該算是比較複雜的吧?如果需要,還可以來一個更加複雜的,不過不再詳細解釋,大家可以拿來推敲一下:

  1. int j =0,k = 0,h=0;  
  2. k = k++ + k++ + k++ + ++k;//k == 7   
  3. j = ++j + j++ + j++ + j++;//j ==7;   
  4. h = ++h + ++h;  
int j =0,k = 0,h=0;
k = k++ + k++ + k++ + ++k;//k == 7
j = ++j + j++ + j++ + j++;//j ==7;
h = ++h + ++h;

 

上面的例子摘自《Java程序員面試寶典》,版權第一。

以上就是我對i++的探討,各位看到的朋友可以自由發表意見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章